{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "22d38674",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "参考博客:https://blog.csdn.net/m0_47704575/article/details/114234033"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4f27873c",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## MNIST数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "f5a00799",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:03:07.674905Z",
     "start_time": "2021-10-08T00:03:07.421747Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "83fb0b34",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:03:26.477213Z",
     "start_time": "2021-10-08T00:03:07.676949Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/hcode/miniconda3/envs/ml2/lib/python3.8/site-packages/sklearn/datasets/_openml.py:1002: FutureWarning: The default value of `parser` will change from `'liac-arff'` to `'auto'` in 1.4. You can set `parser='auto'` to silence this warning. Therefore, an `ImportError` will be raised from 1.4 if the dataset is dense and pandas is not installed. Note that the pandas parser may return different data types. See the Notes Section in fetch_openml's API doc for details.\n",
      "  warn(\n",
      "/home/hcode/miniconda3/envs/ml2/lib/python3.8/site-packages/sklearn/datasets/_openml.py:67: RuntimeWarning: Invalid cache, redownloading file\n",
      "  warn(\"Invalid cache, redownloading file\", RuntimeWarning)\n"
     ]
    }
   ],
   "source": [
    "# 采用sklearn来下载数据集\n",
    "from sklearn.datasets import fetch_openml\n",
    "mnist = fetch_openml('mnist_784', version=1, as_frame=False)   # as_frame为false时表示获得的不是DataFrame类型\n",
    "# # 获取mnist的键值\n",
    "# mnist.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6d02e16a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:03:26.489062Z",
     "start_time": "2021-10-08T00:03:26.478560Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'data': array([[0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        ...,\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.]]),\n",
       " 'target': array(['5', '0', '4', ..., '4', '5', '6'], dtype=object),\n",
       " 'frame': None,\n",
       " 'categories': {},\n",
       " 'feature_names': ['pixel1',\n",
       "  'pixel2',\n",
       "  'pixel3',\n",
       "  'pixel4',\n",
       "  'pixel5',\n",
       "  'pixel6',\n",
       "  'pixel7',\n",
       "  'pixel8',\n",
       "  'pixel9',\n",
       "  'pixel10',\n",
       "  'pixel11',\n",
       "  'pixel12',\n",
       "  'pixel13',\n",
       "  'pixel14',\n",
       "  'pixel15',\n",
       "  'pixel16',\n",
       "  'pixel17',\n",
       "  'pixel18',\n",
       "  'pixel19',\n",
       "  'pixel20',\n",
       "  'pixel21',\n",
       "  'pixel22',\n",
       "  'pixel23',\n",
       "  'pixel24',\n",
       "  'pixel25',\n",
       "  'pixel26',\n",
       "  'pixel27',\n",
       "  'pixel28',\n",
       "  'pixel29',\n",
       "  'pixel30',\n",
       "  'pixel31',\n",
       "  'pixel32',\n",
       "  'pixel33',\n",
       "  'pixel34',\n",
       "  'pixel35',\n",
       "  'pixel36',\n",
       "  'pixel37',\n",
       "  'pixel38',\n",
       "  'pixel39',\n",
       "  'pixel40',\n",
       "  'pixel41',\n",
       "  'pixel42',\n",
       "  'pixel43',\n",
       "  'pixel44',\n",
       "  'pixel45',\n",
       "  'pixel46',\n",
       "  'pixel47',\n",
       "  'pixel48',\n",
       "  'pixel49',\n",
       "  'pixel50',\n",
       "  'pixel51',\n",
       "  'pixel52',\n",
       "  'pixel53',\n",
       "  'pixel54',\n",
       "  'pixel55',\n",
       "  'pixel56',\n",
       "  'pixel57',\n",
       "  'pixel58',\n",
       "  'pixel59',\n",
       "  'pixel60',\n",
       "  'pixel61',\n",
       "  'pixel62',\n",
       "  'pixel63',\n",
       "  'pixel64',\n",
       "  'pixel65',\n",
       "  'pixel66',\n",
       "  'pixel67',\n",
       "  'pixel68',\n",
       "  'pixel69',\n",
       "  'pixel70',\n",
       "  'pixel71',\n",
       "  'pixel72',\n",
       "  'pixel73',\n",
       "  'pixel74',\n",
       "  'pixel75',\n",
       "  'pixel76',\n",
       "  'pixel77',\n",
       "  'pixel78',\n",
       "  'pixel79',\n",
       "  'pixel80',\n",
       "  'pixel81',\n",
       "  'pixel82',\n",
       "  'pixel83',\n",
       "  'pixel84',\n",
       "  'pixel85',\n",
       "  'pixel86',\n",
       "  'pixel87',\n",
       "  'pixel88',\n",
       "  'pixel89',\n",
       "  'pixel90',\n",
       "  'pixel91',\n",
       "  'pixel92',\n",
       "  'pixel93',\n",
       "  'pixel94',\n",
       "  'pixel95',\n",
       "  'pixel96',\n",
       "  'pixel97',\n",
       "  'pixel98',\n",
       "  'pixel99',\n",
       "  'pixel100',\n",
       "  'pixel101',\n",
       "  'pixel102',\n",
       "  'pixel103',\n",
       "  'pixel104',\n",
       "  'pixel105',\n",
       "  'pixel106',\n",
       "  'pixel107',\n",
       "  'pixel108',\n",
       "  'pixel109',\n",
       "  'pixel110',\n",
       "  'pixel111',\n",
       "  'pixel112',\n",
       "  'pixel113',\n",
       "  'pixel114',\n",
       "  'pixel115',\n",
       "  'pixel116',\n",
       "  'pixel117',\n",
       "  'pixel118',\n",
       "  'pixel119',\n",
       "  'pixel120',\n",
       "  'pixel121',\n",
       "  'pixel122',\n",
       "  'pixel123',\n",
       "  'pixel124',\n",
       "  'pixel125',\n",
       "  'pixel126',\n",
       "  'pixel127',\n",
       "  'pixel128',\n",
       "  'pixel129',\n",
       "  'pixel130',\n",
       "  'pixel131',\n",
       "  'pixel132',\n",
       "  'pixel133',\n",
       "  'pixel134',\n",
       "  'pixel135',\n",
       "  'pixel136',\n",
       "  'pixel137',\n",
       "  'pixel138',\n",
       "  'pixel139',\n",
       "  'pixel140',\n",
       "  'pixel141',\n",
       "  'pixel142',\n",
       "  'pixel143',\n",
       "  'pixel144',\n",
       "  'pixel145',\n",
       "  'pixel146',\n",
       "  'pixel147',\n",
       "  'pixel148',\n",
       "  'pixel149',\n",
       "  'pixel150',\n",
       "  'pixel151',\n",
       "  'pixel152',\n",
       "  'pixel153',\n",
       "  'pixel154',\n",
       "  'pixel155',\n",
       "  'pixel156',\n",
       "  'pixel157',\n",
       "  'pixel158',\n",
       "  'pixel159',\n",
       "  'pixel160',\n",
       "  'pixel161',\n",
       "  'pixel162',\n",
       "  'pixel163',\n",
       "  'pixel164',\n",
       "  'pixel165',\n",
       "  'pixel166',\n",
       "  'pixel167',\n",
       "  'pixel168',\n",
       "  'pixel169',\n",
       "  'pixel170',\n",
       "  'pixel171',\n",
       "  'pixel172',\n",
       "  'pixel173',\n",
       "  'pixel174',\n",
       "  'pixel175',\n",
       "  'pixel176',\n",
       "  'pixel177',\n",
       "  'pixel178',\n",
       "  'pixel179',\n",
       "  'pixel180',\n",
       "  'pixel181',\n",
       "  'pixel182',\n",
       "  'pixel183',\n",
       "  'pixel184',\n",
       "  'pixel185',\n",
       "  'pixel186',\n",
       "  'pixel187',\n",
       "  'pixel188',\n",
       "  'pixel189',\n",
       "  'pixel190',\n",
       "  'pixel191',\n",
       "  'pixel192',\n",
       "  'pixel193',\n",
       "  'pixel194',\n",
       "  'pixel195',\n",
       "  'pixel196',\n",
       "  'pixel197',\n",
       "  'pixel198',\n",
       "  'pixel199',\n",
       "  'pixel200',\n",
       "  'pixel201',\n",
       "  'pixel202',\n",
       "  'pixel203',\n",
       "  'pixel204',\n",
       "  'pixel205',\n",
       "  'pixel206',\n",
       "  'pixel207',\n",
       "  'pixel208',\n",
       "  'pixel209',\n",
       "  'pixel210',\n",
       "  'pixel211',\n",
       "  'pixel212',\n",
       "  'pixel213',\n",
       "  'pixel214',\n",
       "  'pixel215',\n",
       "  'pixel216',\n",
       "  'pixel217',\n",
       "  'pixel218',\n",
       "  'pixel219',\n",
       "  'pixel220',\n",
       "  'pixel221',\n",
       "  'pixel222',\n",
       "  'pixel223',\n",
       "  'pixel224',\n",
       "  'pixel225',\n",
       "  'pixel226',\n",
       "  'pixel227',\n",
       "  'pixel228',\n",
       "  'pixel229',\n",
       "  'pixel230',\n",
       "  'pixel231',\n",
       "  'pixel232',\n",
       "  'pixel233',\n",
       "  'pixel234',\n",
       "  'pixel235',\n",
       "  'pixel236',\n",
       "  'pixel237',\n",
       "  'pixel238',\n",
       "  'pixel239',\n",
       "  'pixel240',\n",
       "  'pixel241',\n",
       "  'pixel242',\n",
       "  'pixel243',\n",
       "  'pixel244',\n",
       "  'pixel245',\n",
       "  'pixel246',\n",
       "  'pixel247',\n",
       "  'pixel248',\n",
       "  'pixel249',\n",
       "  'pixel250',\n",
       "  'pixel251',\n",
       "  'pixel252',\n",
       "  'pixel253',\n",
       "  'pixel254',\n",
       "  'pixel255',\n",
       "  'pixel256',\n",
       "  'pixel257',\n",
       "  'pixel258',\n",
       "  'pixel259',\n",
       "  'pixel260',\n",
       "  'pixel261',\n",
       "  'pixel262',\n",
       "  'pixel263',\n",
       "  'pixel264',\n",
       "  'pixel265',\n",
       "  'pixel266',\n",
       "  'pixel267',\n",
       "  'pixel268',\n",
       "  'pixel269',\n",
       "  'pixel270',\n",
       "  'pixel271',\n",
       "  'pixel272',\n",
       "  'pixel273',\n",
       "  'pixel274',\n",
       "  'pixel275',\n",
       "  'pixel276',\n",
       "  'pixel277',\n",
       "  'pixel278',\n",
       "  'pixel279',\n",
       "  'pixel280',\n",
       "  'pixel281',\n",
       "  'pixel282',\n",
       "  'pixel283',\n",
       "  'pixel284',\n",
       "  'pixel285',\n",
       "  'pixel286',\n",
       "  'pixel287',\n",
       "  'pixel288',\n",
       "  'pixel289',\n",
       "  'pixel290',\n",
       "  'pixel291',\n",
       "  'pixel292',\n",
       "  'pixel293',\n",
       "  'pixel294',\n",
       "  'pixel295',\n",
       "  'pixel296',\n",
       "  'pixel297',\n",
       "  'pixel298',\n",
       "  'pixel299',\n",
       "  'pixel300',\n",
       "  'pixel301',\n",
       "  'pixel302',\n",
       "  'pixel303',\n",
       "  'pixel304',\n",
       "  'pixel305',\n",
       "  'pixel306',\n",
       "  'pixel307',\n",
       "  'pixel308',\n",
       "  'pixel309',\n",
       "  'pixel310',\n",
       "  'pixel311',\n",
       "  'pixel312',\n",
       "  'pixel313',\n",
       "  'pixel314',\n",
       "  'pixel315',\n",
       "  'pixel316',\n",
       "  'pixel317',\n",
       "  'pixel318',\n",
       "  'pixel319',\n",
       "  'pixel320',\n",
       "  'pixel321',\n",
       "  'pixel322',\n",
       "  'pixel323',\n",
       "  'pixel324',\n",
       "  'pixel325',\n",
       "  'pixel326',\n",
       "  'pixel327',\n",
       "  'pixel328',\n",
       "  'pixel329',\n",
       "  'pixel330',\n",
       "  'pixel331',\n",
       "  'pixel332',\n",
       "  'pixel333',\n",
       "  'pixel334',\n",
       "  'pixel335',\n",
       "  'pixel336',\n",
       "  'pixel337',\n",
       "  'pixel338',\n",
       "  'pixel339',\n",
       "  'pixel340',\n",
       "  'pixel341',\n",
       "  'pixel342',\n",
       "  'pixel343',\n",
       "  'pixel344',\n",
       "  'pixel345',\n",
       "  'pixel346',\n",
       "  'pixel347',\n",
       "  'pixel348',\n",
       "  'pixel349',\n",
       "  'pixel350',\n",
       "  'pixel351',\n",
       "  'pixel352',\n",
       "  'pixel353',\n",
       "  'pixel354',\n",
       "  'pixel355',\n",
       "  'pixel356',\n",
       "  'pixel357',\n",
       "  'pixel358',\n",
       "  'pixel359',\n",
       "  'pixel360',\n",
       "  'pixel361',\n",
       "  'pixel362',\n",
       "  'pixel363',\n",
       "  'pixel364',\n",
       "  'pixel365',\n",
       "  'pixel366',\n",
       "  'pixel367',\n",
       "  'pixel368',\n",
       "  'pixel369',\n",
       "  'pixel370',\n",
       "  'pixel371',\n",
       "  'pixel372',\n",
       "  'pixel373',\n",
       "  'pixel374',\n",
       "  'pixel375',\n",
       "  'pixel376',\n",
       "  'pixel377',\n",
       "  'pixel378',\n",
       "  'pixel379',\n",
       "  'pixel380',\n",
       "  'pixel381',\n",
       "  'pixel382',\n",
       "  'pixel383',\n",
       "  'pixel384',\n",
       "  'pixel385',\n",
       "  'pixel386',\n",
       "  'pixel387',\n",
       "  'pixel388',\n",
       "  'pixel389',\n",
       "  'pixel390',\n",
       "  'pixel391',\n",
       "  'pixel392',\n",
       "  'pixel393',\n",
       "  'pixel394',\n",
       "  'pixel395',\n",
       "  'pixel396',\n",
       "  'pixel397',\n",
       "  'pixel398',\n",
       "  'pixel399',\n",
       "  'pixel400',\n",
       "  'pixel401',\n",
       "  'pixel402',\n",
       "  'pixel403',\n",
       "  'pixel404',\n",
       "  'pixel405',\n",
       "  'pixel406',\n",
       "  'pixel407',\n",
       "  'pixel408',\n",
       "  'pixel409',\n",
       "  'pixel410',\n",
       "  'pixel411',\n",
       "  'pixel412',\n",
       "  'pixel413',\n",
       "  'pixel414',\n",
       "  'pixel415',\n",
       "  'pixel416',\n",
       "  'pixel417',\n",
       "  'pixel418',\n",
       "  'pixel419',\n",
       "  'pixel420',\n",
       "  'pixel421',\n",
       "  'pixel422',\n",
       "  'pixel423',\n",
       "  'pixel424',\n",
       "  'pixel425',\n",
       "  'pixel426',\n",
       "  'pixel427',\n",
       "  'pixel428',\n",
       "  'pixel429',\n",
       "  'pixel430',\n",
       "  'pixel431',\n",
       "  'pixel432',\n",
       "  'pixel433',\n",
       "  'pixel434',\n",
       "  'pixel435',\n",
       "  'pixel436',\n",
       "  'pixel437',\n",
       "  'pixel438',\n",
       "  'pixel439',\n",
       "  'pixel440',\n",
       "  'pixel441',\n",
       "  'pixel442',\n",
       "  'pixel443',\n",
       "  'pixel444',\n",
       "  'pixel445',\n",
       "  'pixel446',\n",
       "  'pixel447',\n",
       "  'pixel448',\n",
       "  'pixel449',\n",
       "  'pixel450',\n",
       "  'pixel451',\n",
       "  'pixel452',\n",
       "  'pixel453',\n",
       "  'pixel454',\n",
       "  'pixel455',\n",
       "  'pixel456',\n",
       "  'pixel457',\n",
       "  'pixel458',\n",
       "  'pixel459',\n",
       "  'pixel460',\n",
       "  'pixel461',\n",
       "  'pixel462',\n",
       "  'pixel463',\n",
       "  'pixel464',\n",
       "  'pixel465',\n",
       "  'pixel466',\n",
       "  'pixel467',\n",
       "  'pixel468',\n",
       "  'pixel469',\n",
       "  'pixel470',\n",
       "  'pixel471',\n",
       "  'pixel472',\n",
       "  'pixel473',\n",
       "  'pixel474',\n",
       "  'pixel475',\n",
       "  'pixel476',\n",
       "  'pixel477',\n",
       "  'pixel478',\n",
       "  'pixel479',\n",
       "  'pixel480',\n",
       "  'pixel481',\n",
       "  'pixel482',\n",
       "  'pixel483',\n",
       "  'pixel484',\n",
       "  'pixel485',\n",
       "  'pixel486',\n",
       "  'pixel487',\n",
       "  'pixel488',\n",
       "  'pixel489',\n",
       "  'pixel490',\n",
       "  'pixel491',\n",
       "  'pixel492',\n",
       "  'pixel493',\n",
       "  'pixel494',\n",
       "  'pixel495',\n",
       "  'pixel496',\n",
       "  'pixel497',\n",
       "  'pixel498',\n",
       "  'pixel499',\n",
       "  'pixel500',\n",
       "  'pixel501',\n",
       "  'pixel502',\n",
       "  'pixel503',\n",
       "  'pixel504',\n",
       "  'pixel505',\n",
       "  'pixel506',\n",
       "  'pixel507',\n",
       "  'pixel508',\n",
       "  'pixel509',\n",
       "  'pixel510',\n",
       "  'pixel511',\n",
       "  'pixel512',\n",
       "  'pixel513',\n",
       "  'pixel514',\n",
       "  'pixel515',\n",
       "  'pixel516',\n",
       "  'pixel517',\n",
       "  'pixel518',\n",
       "  'pixel519',\n",
       "  'pixel520',\n",
       "  'pixel521',\n",
       "  'pixel522',\n",
       "  'pixel523',\n",
       "  'pixel524',\n",
       "  'pixel525',\n",
       "  'pixel526',\n",
       "  'pixel527',\n",
       "  'pixel528',\n",
       "  'pixel529',\n",
       "  'pixel530',\n",
       "  'pixel531',\n",
       "  'pixel532',\n",
       "  'pixel533',\n",
       "  'pixel534',\n",
       "  'pixel535',\n",
       "  'pixel536',\n",
       "  'pixel537',\n",
       "  'pixel538',\n",
       "  'pixel539',\n",
       "  'pixel540',\n",
       "  'pixel541',\n",
       "  'pixel542',\n",
       "  'pixel543',\n",
       "  'pixel544',\n",
       "  'pixel545',\n",
       "  'pixel546',\n",
       "  'pixel547',\n",
       "  'pixel548',\n",
       "  'pixel549',\n",
       "  'pixel550',\n",
       "  'pixel551',\n",
       "  'pixel552',\n",
       "  'pixel553',\n",
       "  'pixel554',\n",
       "  'pixel555',\n",
       "  'pixel556',\n",
       "  'pixel557',\n",
       "  'pixel558',\n",
       "  'pixel559',\n",
       "  'pixel560',\n",
       "  'pixel561',\n",
       "  'pixel562',\n",
       "  'pixel563',\n",
       "  'pixel564',\n",
       "  'pixel565',\n",
       "  'pixel566',\n",
       "  'pixel567',\n",
       "  'pixel568',\n",
       "  'pixel569',\n",
       "  'pixel570',\n",
       "  'pixel571',\n",
       "  'pixel572',\n",
       "  'pixel573',\n",
       "  'pixel574',\n",
       "  'pixel575',\n",
       "  'pixel576',\n",
       "  'pixel577',\n",
       "  'pixel578',\n",
       "  'pixel579',\n",
       "  'pixel580',\n",
       "  'pixel581',\n",
       "  'pixel582',\n",
       "  'pixel583',\n",
       "  'pixel584',\n",
       "  'pixel585',\n",
       "  'pixel586',\n",
       "  'pixel587',\n",
       "  'pixel588',\n",
       "  'pixel589',\n",
       "  'pixel590',\n",
       "  'pixel591',\n",
       "  'pixel592',\n",
       "  'pixel593',\n",
       "  'pixel594',\n",
       "  'pixel595',\n",
       "  'pixel596',\n",
       "  'pixel597',\n",
       "  'pixel598',\n",
       "  'pixel599',\n",
       "  'pixel600',\n",
       "  'pixel601',\n",
       "  'pixel602',\n",
       "  'pixel603',\n",
       "  'pixel604',\n",
       "  'pixel605',\n",
       "  'pixel606',\n",
       "  'pixel607',\n",
       "  'pixel608',\n",
       "  'pixel609',\n",
       "  'pixel610',\n",
       "  'pixel611',\n",
       "  'pixel612',\n",
       "  'pixel613',\n",
       "  'pixel614',\n",
       "  'pixel615',\n",
       "  'pixel616',\n",
       "  'pixel617',\n",
       "  'pixel618',\n",
       "  'pixel619',\n",
       "  'pixel620',\n",
       "  'pixel621',\n",
       "  'pixel622',\n",
       "  'pixel623',\n",
       "  'pixel624',\n",
       "  'pixel625',\n",
       "  'pixel626',\n",
       "  'pixel627',\n",
       "  'pixel628',\n",
       "  'pixel629',\n",
       "  'pixel630',\n",
       "  'pixel631',\n",
       "  'pixel632',\n",
       "  'pixel633',\n",
       "  'pixel634',\n",
       "  'pixel635',\n",
       "  'pixel636',\n",
       "  'pixel637',\n",
       "  'pixel638',\n",
       "  'pixel639',\n",
       "  'pixel640',\n",
       "  'pixel641',\n",
       "  'pixel642',\n",
       "  'pixel643',\n",
       "  'pixel644',\n",
       "  'pixel645',\n",
       "  'pixel646',\n",
       "  'pixel647',\n",
       "  'pixel648',\n",
       "  'pixel649',\n",
       "  'pixel650',\n",
       "  'pixel651',\n",
       "  'pixel652',\n",
       "  'pixel653',\n",
       "  'pixel654',\n",
       "  'pixel655',\n",
       "  'pixel656',\n",
       "  'pixel657',\n",
       "  'pixel658',\n",
       "  'pixel659',\n",
       "  'pixel660',\n",
       "  'pixel661',\n",
       "  'pixel662',\n",
       "  'pixel663',\n",
       "  'pixel664',\n",
       "  'pixel665',\n",
       "  'pixel666',\n",
       "  'pixel667',\n",
       "  'pixel668',\n",
       "  'pixel669',\n",
       "  'pixel670',\n",
       "  'pixel671',\n",
       "  'pixel672',\n",
       "  'pixel673',\n",
       "  'pixel674',\n",
       "  'pixel675',\n",
       "  'pixel676',\n",
       "  'pixel677',\n",
       "  'pixel678',\n",
       "  'pixel679',\n",
       "  'pixel680',\n",
       "  'pixel681',\n",
       "  'pixel682',\n",
       "  'pixel683',\n",
       "  'pixel684',\n",
       "  'pixel685',\n",
       "  'pixel686',\n",
       "  'pixel687',\n",
       "  'pixel688',\n",
       "  'pixel689',\n",
       "  'pixel690',\n",
       "  'pixel691',\n",
       "  'pixel692',\n",
       "  'pixel693',\n",
       "  'pixel694',\n",
       "  'pixel695',\n",
       "  'pixel696',\n",
       "  'pixel697',\n",
       "  'pixel698',\n",
       "  'pixel699',\n",
       "  'pixel700',\n",
       "  'pixel701',\n",
       "  'pixel702',\n",
       "  'pixel703',\n",
       "  'pixel704',\n",
       "  'pixel705',\n",
       "  'pixel706',\n",
       "  'pixel707',\n",
       "  'pixel708',\n",
       "  'pixel709',\n",
       "  'pixel710',\n",
       "  'pixel711',\n",
       "  'pixel712',\n",
       "  'pixel713',\n",
       "  'pixel714',\n",
       "  'pixel715',\n",
       "  'pixel716',\n",
       "  'pixel717',\n",
       "  'pixel718',\n",
       "  'pixel719',\n",
       "  'pixel720',\n",
       "  'pixel721',\n",
       "  'pixel722',\n",
       "  'pixel723',\n",
       "  'pixel724',\n",
       "  'pixel725',\n",
       "  'pixel726',\n",
       "  'pixel727',\n",
       "  'pixel728',\n",
       "  'pixel729',\n",
       "  'pixel730',\n",
       "  'pixel731',\n",
       "  'pixel732',\n",
       "  'pixel733',\n",
       "  'pixel734',\n",
       "  'pixel735',\n",
       "  'pixel736',\n",
       "  'pixel737',\n",
       "  'pixel738',\n",
       "  'pixel739',\n",
       "  'pixel740',\n",
       "  'pixel741',\n",
       "  'pixel742',\n",
       "  'pixel743',\n",
       "  'pixel744',\n",
       "  'pixel745',\n",
       "  'pixel746',\n",
       "  'pixel747',\n",
       "  'pixel748',\n",
       "  'pixel749',\n",
       "  'pixel750',\n",
       "  'pixel751',\n",
       "  'pixel752',\n",
       "  'pixel753',\n",
       "  'pixel754',\n",
       "  'pixel755',\n",
       "  'pixel756',\n",
       "  'pixel757',\n",
       "  'pixel758',\n",
       "  'pixel759',\n",
       "  'pixel760',\n",
       "  'pixel761',\n",
       "  'pixel762',\n",
       "  'pixel763',\n",
       "  'pixel764',\n",
       "  'pixel765',\n",
       "  'pixel766',\n",
       "  'pixel767',\n",
       "  'pixel768',\n",
       "  'pixel769',\n",
       "  'pixel770',\n",
       "  'pixel771',\n",
       "  'pixel772',\n",
       "  'pixel773',\n",
       "  'pixel774',\n",
       "  'pixel775',\n",
       "  'pixel776',\n",
       "  'pixel777',\n",
       "  'pixel778',\n",
       "  'pixel779',\n",
       "  'pixel780',\n",
       "  'pixel781',\n",
       "  'pixel782',\n",
       "  'pixel783',\n",
       "  'pixel784'],\n",
       " 'target_names': ['class'],\n",
       " 'DESCR': \"**Author**: Yann LeCun, Corinna Cortes, Christopher J.C. Burges  \\n**Source**: [MNIST Website](http://yann.lecun.com/exdb/mnist/) - Date unknown  \\n**Please cite**:  \\n\\nThe MNIST database of handwritten digits with 784 features, raw data available at: http://yann.lecun.com/exdb/mnist/. It can be split in a training set of the first 60,000 examples, and a test set of 10,000 examples  \\n\\nIt is a subset of a larger set available from NIST. The digits have been size-normalized and centered in a fixed-size image. It is a good database for people who want to try learning techniques and pattern recognition methods on real-world data while spending minimal efforts on preprocessing and formatting. The original black and white (bilevel) images from NIST were size normalized to fit in a 20x20 pixel box while preserving their aspect ratio. The resulting images contain grey levels as a result of the anti-aliasing technique used by the normalization algorithm. the images were centered in a 28x28 image by computing the center of mass of the pixels, and translating the image so as to position this point at the center of the 28x28 field.  \\n\\nWith some classification methods (particularly template-based methods, such as SVM and K-nearest neighbors), the error rate improves when the digits are centered by bounding box rather than center of mass. If you do this kind of pre-processing, you should report it in your publications. The MNIST database was constructed from NIST's NIST originally designated SD-3 as their training set and SD-1 as their test set. However, SD-3 is much cleaner and easier to recognize than SD-1. The reason for this can be found on the fact that SD-3 was collected among Census Bureau employees, while SD-1 was collected among high-school students. Drawing sensible conclusions from learning experiments requires that the result be independent of the choice of training set and test among the complete set of samples. Therefore it was necessary to build a new database by mixing NIST's datasets.  \\n\\nThe MNIST training set is composed of 30,000 patterns from SD-3 and 30,000 patterns from SD-1. Our test set was composed of 5,000 patterns from SD-3 and 5,000 patterns from SD-1. The 60,000 pattern training set contained examples from approximately 250 writers. We made sure that the sets of writers of the training set and test set were disjoint. SD-1 contains 58,527 digit images written by 500 different writers. In contrast to SD-3, where blocks of data from each writer appeared in sequence, the data in SD-1 is scrambled. Writer identities for SD-1 is available and we used this information to unscramble the writers. We then split SD-1 in two: characters written by the first 250 writers went into our new training set. The remaining 250 writers were placed in our test set. Thus we had two sets with nearly 30,000 examples each. The new training set was completed with enough examples from SD-3, starting at pattern # 0, to make a full set of 60,000 training patterns. Similarly, the new test set was completed with SD-3 examples starting at pattern # 35,000 to make a full set with 60,000 test patterns. Only a subset of 10,000 test images (5,000 from SD-1 and 5,000 from SD-3) is available on this site. The full 60,000 sample training set is available.\\n\\nDownloaded from openml.org.\",\n",
       " 'details': {'id': '554',\n",
       "  'name': 'mnist_784',\n",
       "  'version': '1',\n",
       "  'description_version': '1',\n",
       "  'format': 'ARFF',\n",
       "  'creator': ['Yann LeCun', 'Corinna Cortes', 'Christopher J.C. Burges'],\n",
       "  'upload_date': '2014-09-29T03:28:38',\n",
       "  'language': 'English',\n",
       "  'licence': 'Public',\n",
       "  'url': 'https://www.openml.org/data/v1/download/52667/mnist_784.arff',\n",
       "  'file_id': '52667',\n",
       "  'default_target_attribute': 'class',\n",
       "  'tag': ['AzurePilot',\n",
       "   'OpenML-CC18',\n",
       "   'OpenML100',\n",
       "   'study_1',\n",
       "   'study_123',\n",
       "   'study_41',\n",
       "   'study_99',\n",
       "   'vision'],\n",
       "  'visibility': 'public',\n",
       "  'minio_url': 'http://openml1.win.tue.nl/dataset554/dataset_554.pq',\n",
       "  'status': 'active',\n",
       "  'processing_date': '2020-11-20 20:12:09',\n",
       "  'md5_checksum': '0298d579eb1b86163de7723944c7e495'},\n",
       " 'url': 'https://www.openml.org/d/554'}"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mnist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e5bc412d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:03:26.493406Z",
     "start_time": "2021-10-08T00:03:26.490382Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       ...,\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.]])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mnist['data']   # 数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9d0b5a6e",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:03:26.498345Z",
     "start_time": "2021-10-08T00:03:26.495476Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['5', '0', '4', ..., '4', '5', '6'], dtype=object)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mnist['target']   # 对应的数字"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1d3c63df",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:03:26.502524Z",
     "start_time": "2021-10-08T00:03:26.499586Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"**Author**: Yann LeCun, Corinna Cortes, Christopher J.C. Burges  \\n**Source**: [MNIST Website](http://yann.lecun.com/exdb/mnist/) - Date unknown  \\n**Please cite**:  \\n\\nThe MNIST database of handwritten digits with 784 features, raw data available at: http://yann.lecun.com/exdb/mnist/. It can be split in a training set of the first 60,000 examples, and a test set of 10,000 examples  \\n\\nIt is a subset of a larger set available from NIST. The digits have been size-normalized and centered in a fixed-size image. It is a good database for people who want to try learning techniques and pattern recognition methods on real-world data while spending minimal efforts on preprocessing and formatting. The original black and white (bilevel) images from NIST were size normalized to fit in a 20x20 pixel box while preserving their aspect ratio. The resulting images contain grey levels as a result of the anti-aliasing technique used by the normalization algorithm. the images were centered in a 28x28 image by computing the center of mass of the pixels, and translating the image so as to position this point at the center of the 28x28 field.  \\n\\nWith some classification methods (particularly template-based methods, such as SVM and K-nearest neighbors), the error rate improves when the digits are centered by bounding box rather than center of mass. If you do this kind of pre-processing, you should report it in your publications. The MNIST database was constructed from NIST's NIST originally designated SD-3 as their training set and SD-1 as their test set. However, SD-3 is much cleaner and easier to recognize than SD-1. The reason for this can be found on the fact that SD-3 was collected among Census Bureau employees, while SD-1 was collected among high-school students. Drawing sensible conclusions from learning experiments requires that the result be independent of the choice of training set and test among the complete set of samples. Therefore it was necessary to build a new database by mixing NIST's datasets.  \\n\\nThe MNIST training set is composed of 30,000 patterns from SD-3 and 30,000 patterns from SD-1. Our test set was composed of 5,000 patterns from SD-3 and 5,000 patterns from SD-1. The 60,000 pattern training set contained examples from approximately 250 writers. We made sure that the sets of writers of the training set and test set were disjoint. SD-1 contains 58,527 digit images written by 500 different writers. In contrast to SD-3, where blocks of data from each writer appeared in sequence, the data in SD-1 is scrambled. Writer identities for SD-1 is available and we used this information to unscramble the writers. We then split SD-1 in two: characters written by the first 250 writers went into our new training set. The remaining 250 writers were placed in our test set. Thus we had two sets with nearly 30,000 examples each. The new training set was completed with enough examples from SD-3, starting at pattern # 0, to make a full set of 60,000 training patterns. Similarly, the new test set was completed with SD-3 examples starting at pattern # 35,000 to make a full set with 60,000 test patterns. Only a subset of 10,000 test images (5,000 from SD-1 and 5,000 from SD-3) is available on this site. The full 60,000 sample training set is available.\\n\\nDownloaded from openml.org.\""
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mnist['DESCR']   # 数据集描述"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "00e8ed3d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:03:26.507000Z",
     "start_time": "2021-10-08T00:03:26.504732Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(70000, 784) (70000,)\n"
     ]
    }
   ],
   "source": [
    "# 获取特征与标签\n",
    "X, y = mnist[\"data\"], mnist[\"target\"]\n",
    "print(X.shape, y.shape)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6bc43890",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:03:26.512718Z",
     "start_time": "2021-10-08T00:03:26.509440Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       ...,\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.]])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "75b27783",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:03:26.523992Z",
     "start_time": "2021-10-08T00:03:26.514797Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0., 189., 190.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0., 143., 247., 153.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0., 136., 247., 242.,  86.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0., 192., 252., 187.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,  62., 185.,  18.,   0.,   0.,   0.,\n",
       "         0.,  89., 236., 217.,  47.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "       216., 253.,  60.,   0.,   0.,   0.,   0., 212., 255.,  81.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0., 206., 252.,  68.,   0.,   0.,\n",
       "         0.,  48., 242., 253.,  89.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "       131., 251., 212.,  21.,   0.,   0.,  11., 167., 252., 197.,   5.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,  29., 232., 247.,  63.,   0.,   0.,\n",
       "         0., 153., 252., 226.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  45.,\n",
       "       219., 252., 143.,   0.,   0.,   0., 116., 249., 252., 103.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   4.,  96., 253., 255., 253., 200., 122.,   7.,\n",
       "        25., 201., 250., 158.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  92., 252.,\n",
       "       252., 253., 217., 252., 252., 200., 227., 252., 231.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,  87., 251., 247., 231.,  65.,  48., 189., 252.,\n",
       "       252., 253., 252., 251., 227.,  35.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0., 190., 221.,\n",
       "        98.,   0.,   0.,   0.,  42., 196., 252., 253., 252., 252., 162.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0., 111.,  29.,   0.,   0.,   0.,   0.,  62.,\n",
       "       239., 252.,  86.,  42.,  42.,  14.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,  15., 148., 253., 218.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0., 121.,\n",
       "       252., 231.,  28.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,  31., 221., 251., 129.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0., 218.,\n",
       "       252., 160.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0., 122., 252.,  82.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'4'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display(X[9],y[9])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e4223979",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:03:27.038930Z",
     "start_time": "2021-10-08T00:03:26.525810Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "some_digit = X[9]   # 第9个数据集对应的数组\n",
    "some_digit_image = some_digit.reshape(28, 28)  # 进行大小重构\n",
    "plt.imshow(some_digit_image, cmap=\"binary\")\n",
    "\n",
    "plt.axis(\"on\")   # 显示坐标轴\n",
    "plt.savefig('test.jpg',dpi=600) \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "87548f44",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:03:27.043900Z",
     "start_time": "2021-10-08T00:03:27.039956Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'4'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "str"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display(mnist['target'][9],type(y[9]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2bc1f271",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:03:27.050670Z",
     "start_time": "2021-10-08T00:03:27.044897Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# 我们将标签转换为整数类型\n",
    "y=y.astype(np.uint8) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "23edf439",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:03:27.054288Z",
     "start_time": "2021-10-08T00:03:27.052145Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# 对数据集进行划分训练数据集与测试数据集\n",
    "X_train, X_test, y_train, y_test = X[:60000], X[60000: ], y[:60000], y[60000:]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "540c8883",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 训练二元分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2b52158b",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:03:27.057261Z",
     "start_time": "2021-10-08T00:03:27.055331Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# 将训练和测试集的标签转换成只有俩种结果的 True False\n",
    "y_train_5=(y_train==5)\n",
    "y_test_5=(y_test==5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a0ee8c51",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:03:42.349921Z",
     "start_time": "2021-10-08T00:03:27.058268Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SGDClassifier(random_state=42)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 我们采用随机梯度下降法进行训练数据\n",
    "from sklearn.linear_model import SGDClassifier\n",
    "\n",
    "sgd_clf=SGDClassifier(random_state=42)   # 设置了随机状态\n",
    "sgd_clf.fit(X_train,y_train_5)    # 开始训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "27999d09",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:03:42.353280Z",
     "start_time": "2021-10-08T00:03:42.350933Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y[9]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "efb2cc15",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:03:42.356762Z",
     "start_time": "2021-10-08T00:03:42.354252Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用训练好的模型进行预测\n",
    "sgd_clf.predict([some_digit])   # some_digit是对应第9个数组\n",
    "# 得到的结果是非5 是正确的"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2599f410",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-06-02T15:14:37.597436Z",
     "start_time": "2021-06-02T15:14:37.575437Z"
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 性能测量"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "54e773d0",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 使用交叉验证测量准确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a958af86",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:02.292781Z",
     "start_time": "2021-10-08T00:03:42.357664Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.95035, 0.96035, 0.9604 ])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score\n",
    "\n",
    "# 交叉验证获取每次的模型准确率 K=3\n",
    "cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring=\"accuracy\")\n",
    "# 结果是都大于95%,下面我们高一个预测非5的"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c66ddd72",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "构造一个非5的分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "21339094",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:02.622285Z",
     "start_time": "2021-10-08T00:04:02.293846Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.91125, 0.90855, 0.90915])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.base import BaseEstimator\n",
    "\n",
    "# 构建分类器\n",
    "\n",
    "\n",
    "class Never5Classifier(BaseEstimator):\n",
    "    def fit(self, X, y=None):\n",
    "        pass    \n",
    "\n",
    "    def predict(self, X):\n",
    "        # 返回全1的数组\n",
    "        return np.zeros((len(X), 1), dtype=bool)\n",
    "\n",
    "never_5_clf = Never5Classifier()\n",
    "cross_val_score(never_5_clf, X_train, y_train_5, cv=3,\n",
    "                scoring=\"accuracy\")   # 其实就是计算一个预测一个非5的准确率\n",
    "\n",
    "# 但这个一般是不能当成一个性能指标的,因为如果存在一种有偏数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6de47103",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:02.626146Z",
     "start_time": "2021-10-08T00:04:02.623223Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.90965"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算真实的非5所占的比例\n",
    "len(y_train_5[y_train_5==False]) / len(y_train_5)  # 计算得到90%多,"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c66e26d4",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 混淆矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "acebbdd0",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:21.785116Z",
     "start_time": "2021-10-08T00:04:02.627258Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ True False False ...  True False False]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(60000,)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_predict\n",
    "\n",
    "y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)  # 跟cross_val_score差不多\n",
    "print(y_train_pred)  # 返回的是每个折叠的预测\n",
    "y_train_pred.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "936baeb8",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "获取混淆矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e994eaf5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:21.794153Z",
     "start_time": "2021-10-08T00:04:21.791030Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True, False, False, ...,  True, False, False])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "array([ True, False, False, ...,  True, False, False])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display(y_train_5,y_train_pred)   # 分别对应训练数据集的结果与经历交叉验证的预测结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d7392bdf",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:21.824300Z",
     "start_time": "2021-10-08T00:04:21.799021Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[53892,   687],\n",
       "       [ 1891,  3530]])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "confusion_matrix(y_train_5, y_train_pred)   # 计算\n",
    "# 非5属于父类,5属于正类\n",
    "# [[53892(真负类TN),   687(假正类FP)],   行表示实际类别,列表示预测类别\n",
    "#  [ 1891(假负类FN),  3530(真正类TP)]]   第一行表示非5,第二行表示5,第一列表示非5,第二列表示5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f80b0c22",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:21.849656Z",
     "start_time": "2021-10-08T00:04:21.825425Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[54579,     0],\n",
       "       [    0,  5421]])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_perfect_predictions=y_train_5\n",
    "confusion_matrix(y_train_5,y_train_perfect_predictions)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "94d28ad9",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 精度与召回率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "10615ca4",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:21.876424Z",
     "start_time": "2021-10-08T00:04:21.850935Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8370879772350012"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "0.6511713705958311"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score,recall_score\n",
    "display(precision_score(y_train_5,y_train_pred),recall_score(y_train_5,y_train_pred))\n",
    "# 第一个是准确率,第二个是召回率"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d5d78ab8",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "当然也可以使用混淆矩阵计算"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "47b2c60e",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:21.902032Z",
     "start_time": "2021-10-08T00:04:21.877539Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "准确率是:  0.8370879772350012\n",
      "召回率是:  0.6511713705958311\n"
     ]
    }
   ],
   "source": [
    "cm=confusion_matrix(y_train_5,y_train_pred)  # 得到混淆矩阵\n",
    "print(\"准确率是: \",cm[1][1]/(cm[0][1]+cm[1][1]))\n",
    "print(\"召回率是: \",cm[1][1]/(cm[1][0]+cm[1][1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "22cd1c55",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:21.917772Z",
     "start_time": "2021-10-08T00:04:21.903352Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7325171197343846"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将准确率和召回率组合为F1分数\n",
    "# 当精度与召回率很接近时,f1分数非常好用\n",
    "from sklearn.metrics import f1_score\n",
    "f1_score(y_train_5,y_train_pred)  # 当准确率与召回率都很高时,这个f1分数便会很高"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "88c22247",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 精度/召回率权衡"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5dca1703",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:21.926260Z",
     "start_time": "2021-10-08T00:04:21.918951Z"
    },
    "pycharm": {
     "name": "#%%\n"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0., 189., 190.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0., 143., 247., 153.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0., 136., 247., 242.,  86.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0., 192., 252., 187.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,  62., 185.,  18.,   0.,   0.,   0.,\n",
       "         0.,  89., 236., 217.,  47.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "       216., 253.,  60.,   0.,   0.,   0.,   0., 212., 255.,  81.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0., 206., 252.,  68.,   0.,   0.,\n",
       "         0.,  48., 242., 253.,  89.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "       131., 251., 212.,  21.,   0.,   0.,  11., 167., 252., 197.,   5.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,  29., 232., 247.,  63.,   0.,   0.,\n",
       "         0., 153., 252., 226.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  45.,\n",
       "       219., 252., 143.,   0.,   0.,   0., 116., 249., 252., 103.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   4.,  96., 253., 255., 253., 200., 122.,   7.,\n",
       "        25., 201., 250., 158.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,  92., 252.,\n",
       "       252., 253., 217., 252., 252., 200., 227., 252., 231.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,  87., 251., 247., 231.,  65.,  48., 189., 252.,\n",
       "       252., 253., 252., 251., 227.,  35.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0., 190., 221.,\n",
       "        98.,   0.,   0.,   0.,  42., 196., 252., 253., 252., 252., 162.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0., 111.,  29.,   0.,   0.,   0.,   0.,  62.,\n",
       "       239., 252.,  86.,  42.,  42.,  14.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,  15., 148., 253., 218.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0., 121.,\n",
       "       252., 231.,  28.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,  31., 221., 251., 129.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0., 218.,\n",
       "       252., 160.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0., 122., 252.,  82.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,\n",
       "         0.,   0.,   0.])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "some_digit   # 对应的是第九个数组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "aa19dadd",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:21.931268Z",
     "start_time": "2021-10-08T00:04:21.927610Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-4081.33692831])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 通过decision——function()的方法返回实例的分数\n",
    "y_scores=sgd_clf.decision_function([some_digit])  # 参数必须为2维的\n",
    "y_scores  # 对应的是第九个数组实例的分数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fe850a08",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:21.935242Z",
     "start_time": "2021-10-08T00:04:21.932370Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 设置一个阀值为0\n",
    "threshold=0\n",
    "y_scores>threshold  # 此时是错误的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d2ea995a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:41.161531Z",
     "start_time": "2021-10-08T00:04:21.936776Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# 使用cross_val_predict获取所有实例的分数\n",
    "# X_train针对所有的数据\n",
    "y_scores=cross_val_predict(sgd_clf,X_train,y_train_5,cv=3,method=\"decision_function\")   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a12d4357",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:41.166366Z",
     "start_time": "2021-10-08T00:04:41.162990Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  1200.93051237, -26883.79202424, -33072.03475406, ...,\n",
       "        13272.12718981,  -7258.47203373, -16877.50840447])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d618f1e2",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:41.183594Z",
     "start_time": "2021-10-08T00:04:41.168122Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.09040123, 0.09038606, 0.09038757, ..., 1.        , 1.        ,\n",
       "       1.        ])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "array([1.00000000e+00, 9.99815532e-01, 9.99815532e-01, ...,\n",
       "       3.68935621e-04, 1.84467810e-04, 0.00000000e+00])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "array([-106527.45300471, -105763.22240074, -105406.2965229 , ...,\n",
       "         38871.26391927,   42216.05562787,   49441.43765905])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 使用precision_recall_curve()函数进行计算所有可能阀值的精度与召回率\n",
    "from sklearn.metrics import precision_recall_curve\n",
    "\n",
    "precisions,recalls,thresholds=precision_recall_curve(y_train_5,y_scores)\n",
    "display(precisions,recalls,thresholds)   # 第一个是精度，第二个是召回率，第三个是对应的阀值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b6c30646",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:41.806440Z",
     "start_time": "2021-10-08T00:04:41.185088Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 显示中文\n",
    "# 显示中文负号\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "\n",
    "def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):\n",
    "\t# 绘制精度曲线\n",
    "    plt.plot(thresholds, precisions[:-1], \"b--\", label=\"Precision\", linewidth=2)\n",
    "    # 绘制召回率曲线\n",
    "    plt.plot(thresholds, recalls[:-1], \"g-\", label=\"Recall\", linewidth=2)\n",
    "    # 设置图例的位置与大小\n",
    "    plt.legend(loc=\"center right\", fontsize=16)\n",
    "    # 设置x轴的信息\n",
    "    plt.xlabel(\"Threshold\", fontsize=16)\n",
    "    # 显示网格\n",
    "    plt.grid(True)\n",
    "    # 指定坐标轴的范围\n",
    "    plt.axis([-50000, 50000, 0, 1])\n",
    "\n",
    "# 设置图像的大小\n",
    "plt.figure(figsize=(8, 4))\n",
    "plot_precision_recall_vs_threshold(precisions, recalls, thresholds)\n",
    "# 保存图片\n",
    "plt.savefig(\"./images/precision_recall_vs_threshold_plot.png\", dpi=600)\n",
    "plt.show()\n",
    "# 在精度曲线上，上端有部分是崎岖的，这是由于当你提高阈值时，精度有时也可能会下降。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "df9fb411",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:41.810079Z",
     "start_time": "2021-10-08T00:04:41.807454Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3370.0194991439594"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#返回精度>=90%的第一个阈值索引\n",
    "threshold_90_precision = thresholds[np.argmax(precisions >= 0.90)] # 返回满足条件的第一个最大的 \n",
    "threshold_90_precision"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "88e6acc5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:41.813484Z",
     "start_time": "2021-10-08T00:04:41.811044Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False, False, False, ...,  True, False, False])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用这个阀值进行二分类\n",
    "y_train_pred_90 = (y_scores >= threshold_90_precision)\n",
    "y_train_pred_90"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "581d802f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:41.828981Z",
     "start_time": "2021-10-08T00:04:41.814371Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9000345901072293"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 检测一下精度与召回率\n",
    "precision_score(y_train_5,y_train_pred_90)  # 精度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "41a9bb37",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:41.844875Z",
     "start_time": "2021-10-08T00:04:41.830489Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.4799852425751706"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5,y_train_pred_90)   # 召回率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4c9b1ca1",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:42.614346Z",
     "start_time": "2021-10-08T00:04:41.845784Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 寻找精度与召回率的关系\n",
    "def plot_precision_vs_recall(precisions, recalls):\n",
    "    plt.plot(recalls, precisions, \"b-\", linewidth=2)\n",
    "    plt.xlabel(\"Recall\", fontsize=16)\n",
    "    plt.ylabel(\"Precision\", fontsize=16)\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "    plt.grid(True)\n",
    "\n",
    "# 设置绘制图像大小\n",
    "plt.figure(figsize=(8, 6))\n",
    "# 图像绘制\n",
    "plot_precision_vs_recall(precisions, recalls)\n",
    "# 保存图片\n",
    "plt.savefig(\"./images/precision_vs_recall_plot.png\", dpi=600)\n",
    "plt.show()\n",
    "# 从图中可以看到，从80%召回率往右，精度开始极度下降。\n",
    "# 你可能会尽量在这个陡降之前选择一个精度"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "09666607",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### ROC曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b4e8200e",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:43.054824Z",
     "start_time": "2021-10-08T00:04:42.615352Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# TPR其实就是召回率，而FPR(假正类率)是被错误分为正类的负类实例比率，也等于1-真负类率，后者就是被正确分为负类的负类实例比率\n",
    "from sklearn.metrics import roc_curve\n",
    "fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)\n",
    "\n",
    "def plot_roc_curve(fpr, tpr,label=None):\n",
    "    plt.plot(fpr, tpr, linewidth=2,label=label)\n",
    "    plt.xlabel(\"FPR\", fontsize=16)\n",
    "    plt.ylabel(\"TPR\", fontsize=16)\n",
    "    plt.plot([0, 1],[0, 1], 'k--')  # 这个虚线只是用来做比较的\n",
    "    \n",
    "plot_roc_curve(fpr, tpr)\n",
    "plt.savefig('./images/ROC曲线.png',dpi=600)\n",
    "plt.show()\n",
    "# 从中我们可以得到我们的曲线其实还可以更接近左上角的,可以改进分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8670210c",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:04:43.070701Z",
     "start_time": "2021-10-08T00:04:43.055790Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9604938554008616"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#计算ROC曲线下面积（AUG）\n",
    "from sklearn.metrics import roc_auc_score\n",
    "roc_auc_score(y_train_5, y_scores)\n",
    "#输出 0.9604938554008616"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4c6bbdb6",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:05:25.527651Z",
     "start_time": "2021-10-08T00:04:43.071616Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# 使用随机森林可以改进分类器\n",
    "#新方法：随机森林\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "forest_clf = RandomForestClassifier(random_state=42)\n",
    "y_probas_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3, \n",
    "                                    method=\"predict_proba\")   \n",
    "# ptdict_proba方法会返回一个数组,每行代表一个实例,每一列代表一个类别\n",
    "y_scores_forest = y_probas_forest[:,1]  # 得到的是每个训练数据的非5的概率\n",
    "fpr_forest, tpr_forest, thresholds_forest = roc_curve(y_train_5, y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "050e3461",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:05:25.976882Z",
     "start_time": "2021-10-08T00:05:25.528619Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(fpr, tpr, \"b:\", label=\"SGD\")\n",
    "plot_roc_curve(fpr_forest, tpr_forest, \"Random Forest\")\n",
    "plt.legend(loc=\"lower right\")\n",
    "plt.savefig('./images/SGD与随机森林的ROC曲线.png',dpi=600)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e6297a70",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:05:25.988339Z",
     "start_time": "2021-10-08T00:05:25.977956Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9983436731328145"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "roc_auc_score(y_train_5, y_scores_forest)\n",
    "#输出：0.9983436731328145"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0025a6a7",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 多类分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f1a49442",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:08:18.829191Z",
     "start_time": "2021-10-08T00:05:25.989456Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([4], dtype=uint8)"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 多分类一般有俩种情况,第一种是OVO(一对一),第二种是OvR(一对多)\n",
    "#第一种一对一需要训练1+2+3+...N个二分类器,然后看哪个类获胜最多\n",
    "#第二种一对多需要训练N个二分类器,然后根据哪个分类器分数最高就选它\n",
    "#在svm算法中它会根据情况选择第一种还是第二种策略\n",
    "from sklearn.svm import SVC\n",
    "svm_clf = SVC()\n",
    "svm_clf.fit(X_train, y_train)\n",
    "svm_clf.predict([some_digit])  # 对应的是第九个训练数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "283997d3",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:08:18.840384Z",
     "start_time": "2021-10-08T00:08:18.830598Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.72300442, -0.30741241,  5.13221141,  0.70495665,  9.31713218,\n",
       "         4.19832479,  6.17612153,  3.95736518,  7.17693433,  7.13443232]])"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 通过decision_function()方法看看是采用哪种策略\n",
    "some_digit_scores = svm_clf.decision_function([some_digit])\n",
    "some_digit_scores  # 结果是10个分数,因此svm算法采用的是OvO策略"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8373c7e4",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:08:18.844591Z",
     "start_time": "2021-10-08T00:08:18.841459Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8)"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "svm_clf.classes_  # 通过此方法查询它的分类器的类别"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "47e56f08",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "强制使用OvO或OvR策略"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6c2930c5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:18:54.933153Z",
     "start_time": "2021-10-08T00:08:18.845611Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([4], dtype=uint8)"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用了OvR策略\n",
    "from sklearn.multiclass import OneVsRestClassifier\n",
    "ovr_clf=OneVsRestClassifier(SVC())\n",
    "ovr_clf.fit(X_train,y_train)\n",
    "ovr_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "888e5278",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:20:56.268333Z",
     "start_time": "2021-10-08T00:18:54.934221Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([4], dtype=uint8)"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 这个就不必运行OvO或OvR了,因为SGD分类器直接就可以将实例分为多个类\n",
    "sgd_clf.fit(X_train, y_train)\n",
    "sgd_clf.predict([some_digit])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "31733c0d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:20:56.271945Z",
     "start_time": "2021-10-08T00:20:56.269383Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-16343.28318658, -23384.59563255,  -6695.83888459,\n",
       "         -8567.75254019,   8917.48038629,  -5477.45198286,\n",
       "        -11951.14635095, -16492.51276695,  -2304.48278571,\n",
       "         -9235.29452453]])"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.decision_function([some_digit])\n",
    "# 第九个数在个类的概率分布情况(如果出现有多个为正数的情况)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "25bfb041",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:24:09.661200Z",
     "start_time": "2021-10-08T00:20:56.272896Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.87365, 0.85835, 0.8689 ])"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cross_val_score(sgd_clf, X_train, y_train, cv=3, scoring=\"accuracy\")\n",
    "#输出：array([0.87365, 0.85835, 0.8689 ])\n",
    "# 评估准确性,采用交叉验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c69f3d8d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:32:48.428629Z",
     "start_time": "2021-10-08T00:24:09.662439Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.8983, 0.891 , 0.9018])"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#上面的准确性大概就是86%左右,我们采用缩放的方式来提升准确性\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "scaler = StandardScaler()\n",
    "X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))\n",
    "cross_val_score(sgd_clf, X_train_scaled, y_train, cv=3, scoring=\"accuracy\")\n",
    "# 此时准确性为90%左右了"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bc71d1f7",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 误差分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "823ad6de",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:41:13.048892Z",
     "start_time": "2021-10-08T00:32:48.429934Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[5577,    0,   22,    5,    8,   43,   36,    6,  225,    1],\n",
       "       [   0, 6400,   37,   24,    4,   44,    4,    7,  212,   10],\n",
       "       [  27,   27, 5220,   92,   73,   27,   67,   36,  378,   11],\n",
       "       [  22,   17,  117, 5227,    2,  203,   27,   40,  403,   73],\n",
       "       [  12,   14,   41,    9, 5182,   12,   34,   27,  347,  164],\n",
       "       [  27,   15,   30,  168,   53, 4444,   75,   14,  535,   60],\n",
       "       [  30,   15,   42,    3,   44,   97, 5552,    3,  131,    1],\n",
       "       [  21,   10,   51,   30,   49,   12,    3, 5684,  195,  210],\n",
       "       [  17,   63,   48,   86,    3,  126,   25,   10, 5429,   44],\n",
       "       [  25,   18,   30,   64,  118,   36,    1,  179,  371, 5107]])"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#混淆矩阵\n",
    "y_train_pred = cross_val_predict(sgd_clf, X_train_scaled, y_train, cv=3)  # 返回对每个实例的预测\n",
    "conf_mx = confusion_matrix(y_train, y_train_pred)\n",
    "conf_mx\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ad9185fe",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:41:13.138585Z",
     "start_time": "2021-10-08T00:41:13.050331Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 使用matplotlib里面matshow()来查看混淆矩阵表示的图像\n",
    "plt.matshow(conf_mx,cmap=plt.cm.gray)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cd0780dc",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:41:13.141677Z",
     "start_time": "2021-10-08T00:41:13.139876Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "row_sums = conf_mx.sum(axis=1, keepdims=True)\n",
    "norm_conf_mx = conf_mx / row_sums\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b5c38cf6",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:41:13.264498Z",
     "start_time": "2021-10-08T00:41:13.142587Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "np.fill_diagonal(norm_conf_mx, 0)\n",
    "plt.matshow(norm_conf_mx, cmap=plt.cm.gray)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "23f16506",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:41:13.270256Z",
     "start_time": "2021-10-08T00:41:13.265794Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# EXTRA\n",
    "def plot_digits(instances, images_per_row=10, **options):\n",
    "    size = 28\n",
    "    images_per_row = min(len(instances), images_per_row)\n",
    "    images = [instance.reshape(size,size) for instance in instances]\n",
    "    n_rows = (len(instances) - 1) // images_per_row + 1\n",
    "    row_images = []\n",
    "    n_empty = n_rows * images_per_row - len(instances)\n",
    "    images.append(np.zeros((size, size * n_empty)))\n",
    "    for row in range(n_rows):\n",
    "        rimages = images[row * images_per_row : (row + 1) * images_per_row]\n",
    "        row_images.append(np.concatenate(rimages, axis=1))\n",
    "    image = np.concatenate(row_images, axis=0)\n",
    "    plt.imshow(image, cmap = mpl.cm.binary, **options)\n",
    "    plt.axis(\"off\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c8d7ff97",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:41:13.274096Z",
     "start_time": "2021-10-08T00:41:13.271782Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "def plot_digit(data):\n",
    "    image = data.reshape(28, 28)\n",
    "    plt.imshow(image, cmap = mpl.cm.binary,\n",
    "               interpolation=\"nearest\")\n",
    "    plt.axis(\"off\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4d69761f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:41:13.432581Z",
     "start_time": "2021-10-08T00:41:13.275284Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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87d4H173h2/KOfrw5cMmJiaYmppidnaWmZmZub/gihszPj6e+Ph4QkJC5kXe56Pg2/XW1NRgNpuvmYkYEBAgSNbJZDIiIiIERRp/4nA4hHysTqcTRLHVajUhISGkpKQIr5VIJEJIcqG1Z29H3G43Q0NDOBwOjEYj/f3917wmKSmJ8PBwYSHyDeudp4XnL9Y5flLweDyMjo5iNBoxm80MDg7S3d1NY2MjtbW1DA0NCYIVWVlZwmlx06ZNpKSkzFtF441ss9vttLS0cO7cOVpbW2lpaaGpqUkQncjMzCQjI0PYtK1evZro6Gi/bso9Ho9QOT42Nsb4+LjwPYVCQUxMjDDnMSIiYlEVjQYGBjAajZhMJkZHR4Wq2YSEBJRKJSEhIURGRhIYGDgfl5t/5ygi8ilFdI63GWazmd7eXhobG7lw4QJ9fX1MT08Ljf9Llixhy5YtZGdnL6jSTGtrK729vUKb2OzsLB6Ph9zcXPLz88nKymLVqlXC6DeRRUF0jiIi84ToHEVE/nK47vO88AFlERERERGR2xzROYqIiIiIiFyF6BxFRERERESu4sOafD6puRUREZFrEZ9nEZGPiHhyFBERERERuQrROYqIiIiIiFyF6BxFRERERESuQnSOIiIiIiIiVyE6RxERERERkasQnaOIiIiIiMhViM5RRERERETkKkTnKCIiIiIichWicxQREREREbkK0TmKiIiIiIhchegcRURERERErkJ0jiIiIiIiIlchOkcREREREZGrEJ2jiIiIiIjIVYjOUURERERE5CpE5ygiIiIiInIVonMUERERERG5CtE5ioiIiIiIXIXoHEVERERERK5CdI4iIiIiIiJXITpHERERERGRqxCdo4iIiIiIyFWIzlFEREREROQqROcoIiIiIiJyFaJzFBERERERuQrROYqIiIiIiFyF6BxFRERERESuQnSOIiIiIiIiVyE6RxERERERkasQnaOIiIiIiMhViM5RRERERETkKkTnKCIiIiIichWicxQREREREbkK0TmKiIiIiIhchegcRURERERErkJ0jiIiIiIiIlchOkcREREREZGrEJ2jiIiIiIjIVcg+5PveBbFCROSThWSxDbhJxOdZRORarvs8iydHERERERGRqxCdo4iIiIiIyFWIzlFEREREROQqROcoIiIiIiJyFR9WkPMXj8fjoa+vj+Hh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",
      "text/plain": [
       "<Figure size 576x576 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "cl_a, cl_b = 3, 5\n",
    "# 3为样本的负类,5为样本的正类\n",
    "X_aa = X_train[(y_train == cl_a) & (y_train_pred == cl_a)]  # 获取真负类\n",
    "X_ab = X_train[(y_train == cl_a) & (y_train_pred == cl_b)]  # 获取假负类\n",
    "X_ba = X_train[(y_train == cl_b) & (y_train_pred == cl_a)]  # 获取假正类\n",
    "X_bb = X_train[(y_train == cl_b) & (y_train_pred == cl_b)]  # 获取真正类\n",
    "\n",
    "plt.figure(figsize=(8,8))\n",
    "# 截取前二十五个数据\n",
    "plt.subplot(221); plot_digits(X_aa[:25], images_per_row=5)  \n",
    "plt.subplot(222); plot_digits(X_ab[:25], images_per_row=5)  \n",
    "plt.subplot(223); plot_digits(X_ba[:25], images_per_row=5)\n",
    "plt.subplot(224); plot_digits(X_bb[:25], images_per_row=5)\n",
    "#plt.save_fig(\"error_analysis_digits_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8262f36f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:41:13.435854Z",
     "start_time": "2021-10-08T00:41:13.433603Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(25, 784)"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_aa[:25].shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6f320d42",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 多标签分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "52da715d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:41:13.455673Z",
     "start_time": "2021-10-08T00:41:13.436786Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier()"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "y_train_large=(y_train>=7)\n",
    "y_train_odd=(y_train%2==1)\n",
    "y_multilabel=np.c_[y_train_large,y_train_odd]\n",
    "\n",
    "knn_clf=KNeighborsClassifier()\n",
    "knn_clf.fit(X_train,y_multilabel)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2d762132",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:41:13.497628Z",
     "start_time": "2021-10-08T00:41:13.456624Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False, False]])"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4ec4c894",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:42:34.872741Z",
     "start_time": "2021-10-08T00:41:13.498684Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "y_train_knn_pred=cross_val_predict(knn_clf,X_train,y_multilabel,cv=3)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "46ae1dbf",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:42:34.877458Z",
     "start_time": "2021-10-08T00:42:34.874396Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False,  True],\n",
       "       [False, False],\n",
       "       [False, False],\n",
       "       ...,\n",
       "       [False,  True],\n",
       "       [False, False],\n",
       "       [ True, False]])"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_knn_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f1ec27c7",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:42:34.898219Z",
     "start_time": "2021-10-08T00:42:34.878507Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.976410265560605"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f1_score(y_multilabel,y_train_knn_pred,average=\"macro\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "26f541e4",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 多输出分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "50975c9e",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:42:35.690248Z",
     "start_time": "2021-10-08T00:42:34.899236Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "noise=np.random.randint(0,100,(len(X_train),784))\n",
    "X_train_mod=X_train+noise\n",
    "noise=np.random.randint(0,100,(len(X_test),784))\n",
    "X_test_mod=X_test+noise\n",
    "y_train_mod=X_train\n",
    "y_test_mod=X_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "354a7ca1",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:42:35.743266Z",
     "start_time": "2021-10-08T00:42:35.697932Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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c5npxeDRom41Art06VKZq04fqFHZ6ETCnDlzXGzdunUyd9y4cS4W3TL86quvutj58+dl7syZM13sbtzwq064RKdWom57f/Xkk09mFYs888wzWedG/92qkw6q8x/dlH071EUFahzfzKy6utrF1Ji/mdmkSZPu7MES45MuACRE0QWAhCi6AJAQRRcAEsq4T7enp8d9MWoAqYZVNJKqbgmObopVY5HROKna9atuCDbTzbFTp07JXDXqqsZiu7u75etVYyJ6H5944gkX+/TTT2Xue++952JqbNrM7IMPPnCxAwcOyFw1rqlGQ8104y9quqlma2lpab/dpwuzH3/8UcbV73HUFF+/fr2LFRUV3dmD3R3s0wWA3kbRBYCEKLoAkBBFFwASougCQEIZTy90d3e7Lw4dOlTmqo711atXZa461RB1/hU1RmxmdubMGReLlkKrTmheXp7MVV1+1c2PRi3V6YdolFktUn/kkUdkrhplVqPBZmavvPJK1s9w6NAhF4t+7urUiVrEbmZWUlLiYrW1tZxe6CdUjYhOJKjcFStWyNyXXnrpzh7s3uH0AgD0NoouACRE0QWAhCi6AJBQxn26qiGiRm3NzDo6OlwsGgdVjaVozHTAAP//hbNnz8pc9bxTp06VudevX3cx1YgzMxsyZIiLqWZTVVWVfL163ujm4K+//trF1PismX5eNd5spn8+ra2tMlfd+Kx2FZvpn5vagWym96mi//jkk09cLKoRhYWFLhbt3r3f8EkXABKi6AJAQhRdAEiIogsACWWcSGtqanJf7Orqkrmq2VReXi5zo0soFdWcUvt4zfTFddHUlfq+o4vv1PescsvKyrJ+fdS0e/HFF11MTZ6ZmS1fvtzFoibj008/7WLRxaFqR26UO3LkSBdTTUoz/TsyePBgJtL6mMbGRhlXl25Gvyu//vqriy1atOjOHiw9JtIAoLdRdAEgIYouACRE0QWAhCi6AJBQxjFgdZPu448/LnO3b9/uYtE+XTU6evz4cZnb3NzsYtGJi4KCgqyey0zfFhp1UmtqalxM7di9cOGCfL0ae/7iiy9krjqpcOPGDZmrdpH+9ddfMledaohOJKgTH9EI76BBg7L+c9UzLFy4UObi/vXzzz/LuPrvq6GhQebOnz//rj7TfwmfdAEgIYouACRE0QWAhCi6AJBQxkaauoww2u2qxkGjBpBq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",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "some_index = 0\n",
    "plt.subplot(121); plot_digit(X_test_mod[some_index])\n",
    "plt.subplot(122); plot_digit(y_test_mod[some_index])\n",
    "#save_fig(\"noisy_digit_example_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0a77770a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:42:41.367159Z",
     "start_time": "2021-10-08T00:42:35.744914Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAADnCAYAAADl9EEgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAE50lEQVR4nO3dIYtUXRzA4RlZFJMWwbJYjCIYTTaxaTQZ/RAWm9FqsIjVJoKwX0ARbGo1aRMUbC67b35h94zund35zezzxP1z71xYfx6Yw7k739/fnwE9Z1b9AMDBxAlR4oQocUKUOCFqa8HcV7lw/OYH/dDKCVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcECVOiBInRIkTosQJUeKEKHFClDghSpwQJU6IEidEiROixAlR4oQocUKUOCFKnBAlTogSJ0SJE6LECVHihChxQpQ4IUqcELW16gc4LvP5/NDZ48ePh9dub28P51evXh3Ob926NZxvqp8/fw7nFy9ePJHn2BRWTogSJ0SJE6LECVHihChxQpQ4IWpj9znfv39/6OzmzZsn+CQn6/bt28P5zs7OsX32hQsXhvNfv34N53t7e8t8nLVn5YQocUKUOCFKnBAlTogSJ0SJE6Lm+/v7o/lwuK7evXs3nL9+/Xo4//z586TPP3/+/KGzV69eTbr3gwcPhvPROdfZbDb78ePHobM3b94c6ZmWYcP3QA/8pVg5IUqcECVOiBInRIkTosQJUeKEqFO5z8nR7O7uDucPHz4czl+8eHHkz7bPCWSIE6LECVHihChxQpQ4IUqcELWx761l+ba2xv9cfv/+Pen+i87RnjZWTogSJ0SJE6LECVHihChxQpQjYyzNtWvXhvNFx76+fPmyzMdZJ46MwToRJ0SJE6LECVHihChxQpQ4IcqRMf7ahw8fhvNF+5SPHj1a5uNsPCsnRIkTosQJUeKEKHFClDghSpwQ5Twnf+3MmWn/l3/9+nU4v3LlyqT7rzHnOWGdiBOixAlR4oQocUKUOCFKnBDlPCf/8/LlyyNf++TJk+H8FO9jHomVE6LECVHihChxQpQ4IUqcECVOiHKek/+Zcmbz+/fvw/nly5ePfO8N5zwnrBNxQpQ4IUqcECVOiBInRDkydsos2ioZba09e/ZseK2tkuWyckKUOCFKnBAlTogSJ0SJE6LECVH2OTfMp0+fJl0/nx94emk2m81m9+7dm3Rv/o2VE6LECVHihChxQpQ4IUqcECVOiLLPuWGuX78+6frnz58fOnNe82RZOSFKnBAlTogSJ0SJE6LECVHihCj7nGvm6dOnw/mCP+k4u3HjxnB+//79f34mjoeVE6LECVHihChxQpQ4IUqcEDVf8NX7+Ht5lm53d3c4P3v27HC+aCvl7du3w/mdO3eGc47Fge8jtXJClDghSpwQJU6IEidEiROixAlRjozFXLp0adL1d+/eHc7tY64PKydEiROixAlR4oQocUKUOCFKnBDlPOcK/Pnz59DZuXPnJt3748ePw/miV2OyEs5zwjoRJ0SJE6LECVHihChxQpQ4Ico+5wp8+/bt0Nn29vake+/t7U26npWwzwnrRJwQJU6IEidEiROixAlR4oQo761dgSl7mTs7O0t8EsqsnBAlTogSJ0SJE6LECVHihChHxlZgypExR8I2kiNjsE7ECVHihChxQpQ4IUqcECVOiLLPCatnnxPWiTghSpwQJU6IEidEiROixAlRi16NeeD+C3D8rJwQJU6IEidEiROixAlR4oSo/wBPJKbJ05OY+wAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "knn_clf.fit(X_train_mod, y_train_mod)\n",
    "clean_digit = knn_clf.predict([X_test_mod[some_index]])\n",
    "plot_digit(clean_digit)\n",
    "#save_fig(\"cleaned_digit_example_plot\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "26d42f78",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "c0642af8",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 练习题"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bec94d4a",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 为MNIST数据集构建一个分类器,并在测试集上达成超过97%的准确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1484c6a9",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:52:11.161585Z",
     "start_time": "2021-10-08T00:42:41.368247Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 6 candidates, totalling 30 fits\n",
      "[CV 1/5] END ....n_neighbors=3, weights=uniform;, score=0.972 total time=  18.7s\n",
      "[CV 2/5] END ....n_neighbors=3, weights=uniform;, score=0.971 total time=  17.2s\n",
      "[CV 3/5] END ....n_neighbors=3, weights=uniform;, score=0.969 total time=  18.8s\n",
      "[CV 4/5] END ....n_neighbors=3, weights=uniform;, score=0.969 total time=  16.8s\n",
      "[CV 5/5] END ....n_neighbors=3, weights=uniform;, score=0.970 total time=  16.9s\n",
      "[CV 1/5] END ...n_neighbors=3, weights=distance;, score=0.972 total time=  16.6s\n",
      "[CV 2/5] END ...n_neighbors=3, weights=distance;, score=0.972 total time=  17.2s\n",
      "[CV 3/5] END ...n_neighbors=3, weights=distance;, score=0.970 total time=  16.7s\n",
      "[CV 4/5] END ...n_neighbors=3, weights=distance;, score=0.970 total time=  17.2s\n",
      "[CV 5/5] END ...n_neighbors=3, weights=distance;, score=0.971 total time=  17.7s\n",
      "[CV 1/5] END ....n_neighbors=4, weights=uniform;, score=0.969 total time=  20.2s\n",
      "[CV 2/5] END ....n_neighbors=4, weights=uniform;, score=0.968 total time=  19.8s\n",
      "[CV 3/5] END ....n_neighbors=4, weights=uniform;, score=0.968 total time=  19.7s\n",
      "[CV 4/5] END ....n_neighbors=4, weights=uniform;, score=0.967 total time=  19.6s\n",
      "[CV 5/5] END ....n_neighbors=4, weights=uniform;, score=0.970 total time=  20.4s\n",
      "[CV 1/5] END ...n_neighbors=4, weights=distance;, score=0.973 total time=  19.1s\n",
      "[CV 2/5] END ...n_neighbors=4, weights=distance;, score=0.972 total time=  19.8s\n",
      "[CV 3/5] END ...n_neighbors=4, weights=distance;, score=0.970 total time=  19.2s\n",
      "[CV 4/5] END ...n_neighbors=4, weights=distance;, score=0.971 total time=  19.6s\n",
      "[CV 5/5] END ...n_neighbors=4, weights=distance;, score=0.972 total time=  19.9s\n",
      "[CV 1/5] END ....n_neighbors=5, weights=uniform;, score=0.970 total time=  19.6s\n",
      "[CV 2/5] END ....n_neighbors=5, weights=uniform;, score=0.970 total time=  19.8s\n",
      "[CV 3/5] END ....n_neighbors=5, weights=uniform;, score=0.969 total time=  19.7s\n",
      "[CV 4/5] END ....n_neighbors=5, weights=uniform;, score=0.968 total time=  19.8s\n",
      "[CV 5/5] END ....n_neighbors=5, weights=uniform;, score=0.969 total time=  20.2s\n",
      "[CV 1/5] END ...n_neighbors=5, weights=distance;, score=0.970 total time=  19.6s\n",
      "[CV 2/5] END ...n_neighbors=5, weights=distance;, score=0.971 total time=  19.9s\n",
      "[CV 3/5] END ...n_neighbors=5, weights=distance;, score=0.970 total time=  19.7s\n",
      "[CV 4/5] END ...n_neighbors=5, weights=distance;, score=0.969 total time=  19.8s\n",
      "[CV 5/5] END ...n_neighbors=5, weights=distance;, score=0.971 total time=  20.2s\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, estimator=KNeighborsClassifier(),\n",
       "             param_grid=[{'n_neighbors': [3, 4, 5],\n",
       "                          'weights': ['uniform', 'distance']}],\n",
       "             verbose=3)"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "param_grid = [{'weights': [\"uniform\", \"distance\"], 'n_neighbors': [3, 4, 5]}]\n",
    "\n",
    "knn_clf = KNeighborsClassifier()\n",
    "grid_search = GridSearchCV(knn_clf, param_grid, cv=5, verbose=3)\n",
    "grid_search.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ca3a1f39",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:52:11.166038Z",
     "start_time": "2021-10-08T00:52:11.163171Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'n_neighbors': 4, 'weights': 'distance'}"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 寻找最佳参数\n",
    "grid_search.best_params_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7e177ef2",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:52:11.170316Z",
     "start_time": "2021-10-08T00:52:11.167547Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9716166666666666"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid_search.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e5e583fe",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:52:31.076684Z",
     "start_time": "2021-10-08T00:52:11.171411Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9714"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算准确率\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "y_pred = grid_search.predict(X_test)\n",
    "accuracy_score(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ee3c8ec9",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 对MNIST数据进行任意方向移动,并测试训练后的准确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "da9b2870",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:52:31.079267Z",
     "start_time": "2021-10-08T00:52:31.077683Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "from scipy.ndimage.interpolation import shift"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "350c7ff5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:52:31.082969Z",
     "start_time": "2021-10-08T00:52:31.080642Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "def shift_image(image, dx, dy):\n",
    "    image = image.reshape((28, 28))\n",
    "    shifted_image = shift(image, [dy, dx], cval=0, mode=\"constant\")\n",
    "    return shifted_image.reshape([-1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "57013f56",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:52:31.246795Z",
     "start_time": "2021-10-08T00:52:31.084026Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAp0AAADTCAYAAADDGKgLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAddklEQVR4nO3de5Qc5Xnn8d9PAgdhgrgJIzCKQFbWwgsWOcPFgCSyDrvYECQIIK4RWXa5rMWJfSyMVknWOjkxONwCiw0YL6xkFjCcgwlg7mYl2MSOV4LlIhCsZCMjgQKDpIAEMiDz7B9V8jYzb2u6p/udnu7+fs7pM11Pv1311sw88z5TVW+XI0IAAABATiNa3QEAAAB0PopOAAAAZEfRCQAAgOwoOgEAAJAdRScAAACyo+gEAABAdhSdw4jtVbbn1PmesH1yk/sx3/ayZq4TGCq15FHfNrb3sv2o7XdtN/Vz5GzvUebp0XW+78e2FzSzL0C7acd8tr3A9o/rXO9nbf/M9q9tr2qwm8MWRWeT2d7H9k2219j+wPZrtr9v+9M1vP0QSdfXucmxku6vv6dA+7E9xvb15SDzvu03bD9u+5g6V9U31+ZI2lvSZEljbR9dDix7NKnrAPognz/mbyS9J+mzkg6xfY7tTS3uU9Nt1+oOdBLb+0n6qaRXJM2StELSBEnfkrTE9hciYlXifZ+IiA8iorfebUbEPzfWa6Ct3C1pR0nnSlopaU9J0yTtXs9KErn2GUlPRcQKqTjq0HhXAQyAfP7/PiPp3q01gu3W9iYTjnQ213clfSTpjyLi8Yh4NSIWSfqjMv5dSbK92PYNtq+03SvpH8t431MEv2/7ifJw+8u2v2x7k+1zKtr89vS67fHl8p/Yfsz2e7ZfrPyv0fZI2zfbfsX2ZtsrbH/DNr8LGNZs7yJpiqS5ZX79KiKWRMSVEfHDPs13sP092++UZx0u7rOu3+ZaeSpruqQ/LfNngaRFZdPeiphc+IbtX5T587zts/qs+xDbT5V5+38kHVbDvu1YnpLbVB7tmZdos6vthbY3lNv+ie3PVbz+z7ZnViz/o+2NtrcrlyeW+7JPxffgL7f1fQJy6eR8TuzrNrfj4hKAz0v6L2X/Fkv675I+WS6H7fn1bnc4otBoEtu7STpW0ncj4r3K18rl6yV9yfauZfgsSVaRdH+aWN8ISfdI2iLpcEnnSPqmpN+poTvfkvRfVfwSL5H0Q9s7la+NkPSapFMlTZL0F5LmSfqzGncVaJVN5eME2zsM0PZrkp6X9AeS/lbS5ba/UKXtIZJ+IukuFZer/LmkPylf+1xFTCpOgZ0r6SuSDpB0maTv2T5Okmx/UtIDkn4pqUfSXElX1rBvV0o6ptzuFyUdLGlqnzYLVAx40yUdquJU3MO2R5WvPyHpD8t+7Fhu//3yqyQdLWllRLxWsc56vk9AM3VyPve1ze2UfXpZ0lXl8xMkfVVFjo8tH4PZ7vATETya8FAxGISkE6u8fmL5+qGSFkt6LtFmlaQ55fN/p6Lg3Kfi9SPKdZxTEQtJJ5fPx5fL51e8vk8ZO2obff+2pJ9ULM+XtKzV31MePPo+VAwe6yX9WtLPVPwhPqxPm1WS7ugTWyHpL/u0mVOx/GNJCyqWjy7zZo+K2CclbZY0pc+6r5H0YPn8PEn/ImmnitfPKtd1dJV92klFcXhmn9i/bO2TpInlOqZWtBkt6W1J/6FcvlDSy+XzYyQtl7RQ0n8uY7dJ+n493ycePHI+OjGfyzYLJP241u2Uy8skza9YPkfSplb/jJr94Ehn81WbKec+rz81wHo+K+n1+PhRiSUqTtMP5LmK56+XX/f8bUfsC2wvtd3r4kLlr0kaV8N6gZaKiLtVTBD4Y0kPqfhH7J8Sp6Of67P8uipyYJAOkLSDiqOLm7Y+VBR7E8o2k1T8Q1k5AeBnA6x3gqRPVLYr3/98RZtJKnK/ss3bZZsDytBiSb9ve28Vg+yiMnZ0+fq0crlSju8TUJMOzefBbKdrMJGoeVaoKCg/J+nvE69PKl//Rbn87gDrs6oXsAP5cOuTiAgXFySPkKTymq9rVMzu+6mkd1Qc8j9xkNsChlRE/FrSY+Xjr23/N0nzbV8ZER+UzT7s+zY1fjnR1vf/saRX+7y2dXuDufq/lvdsq01xyiNiue03VBSZR6vI8yWSrrN9gIqzHov7vDfH9wmoWQfm82C20zX449IkEbFe0iOS/lN5PdVvlctfkfRQ2a4WyyXtUx612KpHjf/MjpL084j4TkQ8HREr1YX/baGjvKjiH+iBrgurx9bBbmSf7bwv6fciYmWfx68q2hxYXgu21eEDbGulisHnt+3K9//rPtseIekLFW12lnRg+dpWT0g6TsXfiieimAn7lqRvqP/1nMBw1O753Fct26nW55HbeL0tUXQ212wVyfIT2//G9r4uPkD2MRX/Mc2uY12PqbiweKHtz9s+XNLVKq7zbOTDbv+vpD+w/aVyNutfqTjtBgxrtne3/T9tn2X7INv72T5FRUH1eES808TN/UpFnh3n4rMEd4qIjSquObvS9r+3/Rnbk8vLVc4r33e7ihy9xfbnXHxyxF9sa0PlqbubJf2t7WPKGem3qGLAieKjX+5VMflgiu0DJf0PFWcqbq9Y3WJJMyWtiIg3y9gTKq5DWzzo7wbQZJ2az33VuJ2UVSpm7R/j4gPpd9xG27ZB0dlEEfELFUcYXpB0q4oZb7erOGp5SES8Use6PlJxyvt3JP1vFRMCvqUicX7dQDe/p2JW3+0qTr2NVzFjDhjuNkn6JxUzT59QkWeXqvhdnrmN99WtPCL4TRU594ak75Qv/ZWKiXZzyu0/pmIyxCvl+zZJOl7FxJ+nVQw2l9SwyTkqrsG8p/y6TNKTfdr8mYq/BfeVX3eUdGxEbK5os0hFsbp4gBjQap2cz31tcztV+vxTSTdKukNSr4pivO25nCWFNmD785KekdQTEQNNRAIAABg2KDqHMdsnqphwtELFEcmrVZymPzj4wQEAgDbC7PXh7XdVfBDuvpI2qDg99jUKTgAA0G440gkAAIDsmEgEAACA7BoqOm0fa/tl2yttz21WpwDkQc4C7YN8RacZ9Ol12yNVfObjMZLWqPj4ndMj4sVq79ljjz1i/Pjxg9oe0EyrVq3SW2+91Yy7TbSNenOWfMVwQb4yxqK9VMvZRiYSHariDhe/lCTbP5Q0XR+/O8bHjB8/XkuXLm1gk0Bz9PT0tLoLrVBXzpKvGC7IV8ZYtJdqOdvI6fV9JK2uWF5TxgAMT+Qs0D7IV3ScRorO1KmOfufqbZ9ne6ntpb29vQ1sDkCDBsxZ8hUYNhhj0XEaKTrXqPj8yK0+Len1vo0i4qaI6ImInjFjxjSwOQANGjBnyVdg2GCMRcdppOhcImmi7f1sf0LSaSruCQxgeCJngfZBvqLjDHoiUURssT1b0iOSRkq6JSJeaFrPADQVOQu0D/IVnaih22BGxIOSHmxSXwBkRs4C7YN8RafhjkQAAADIjqITAAAA2VF0AgAAILuGrulEe9u0aVO/2JQpU5Jt33777WR8wYIFyfjUqVMH3S8AAJolNdZJjHetwJFOAAAAZEfRCQAAgOwoOgEAAJAdRScAAACyo+gEAABAdsxe7yBbtmxJxi+99NJk/L77+t/G99lnn61rm3vvvXdd7QEAaFRqvKtnrJMY71qBI50AAADIjqITAAAA2VF0AgAAIDuKTgAAAGTHRKIO8sADDyTj8+fPr3kdO+ywQzJ+3HHHJeNjx46ted0AADRDaryrZ6yTGO9agSOdAAAAyI6iEwAAANlRdAIAACA7ik4AAABkR9EJAACA7BqavW57laSNkn4jaUtE9DSjUyisXbs2Gb/sssuS8euuuy4Zt52M77///v1il19+ebLtSSedlIyjvZCzQPvopnxtxnhXz1gnMd61QjM+MukPI+KtJqwHwNAgZ4H2Qb6iY3B6HQAAANk1WnSGpEdtP2X7vGZ0CEBW5CzQPshXdJRGT68fGRGv295T0mO2X4qIJysblIlyniSNGzeuwc0BaNA2c5Z8BYYVxlh0lIaOdEbE6+XXNyXdI+nQRJubIqInInrGjBnTyOYANGignCVfgeGDMRadZtBHOm1/UtKIiNhYPv+3kv66aT3rIps2bUrGDzrooGR83bp1yfiIEen/IW688cZkfObMmf1iO++8c7It2h85C7SPTs3XnONdPWOdxHjXCo2cXv+UpHvKjyjYTtLtEfFwU3oFIAdyFmgf5Cs6zqCLzoj4paTPN7EvADIiZ4H2Qb6iE/GRSQAAAMiOohMAAADZUXQCAAAgu2bcBhM1evjh9DXgF198cTJebdbepEmTkvF58+Yl42eeeWYNvQMwnKVm/U6ZMiXZ9u23307GFyxYkIxPnTp10P0CUlox3jHWDX8c6QQAAEB2FJ0AAADIjqITAAAA2VF0AgAAIDuKTgAAAGTH7PVM5syZ0y+2fv36ZNt33323rnVff/31yfi0adPqWg+A1tmyZUsyfumllybj9913X7/Ys88+W9c2995777raAwNJjXUS4x3SONIJAACA7Cg6AQAAkB1FJwAAALKj6AQAAEB2FJ0AAADIjtnrDUrdD1mSHnnkkX6x1atXJ9tu3rw5Gb/tttuSce6TDLS/Bx54IBmfP39+zevYYYcdkvHjjjsuGR87dmzN6wYq1TPWSYx3SONIJwAAALKj6AQAAEB2FJ0AAADIjqITAAAA2Q1YdNq+xfabtpdVxHaz/ZjtFeXXXfN2E0CtyFmgfZCv6Ca1zF5fIOk7kn5QEZsr6fGI+LbtueXyJc3v3vDx3nvvJePTp09Pxl944YWa111t1t7MmTOTcds1rxtdaYHI2SG3du3aZPyyyy5Lxq+77rpkvFp+77///v1il19+ebLtSSedlIxjWFqgYZavqfGuGWOdxHjX7QY80hkRT0pa3yc8XdLC8vlCSTOa2y0Ag0XOAu2DfEU3Gew1nZ+KiLWSVH7ds3ldApABOQu0D/IVHSn7RCLb59leantpb29v7s0BaAD5CrQXchbtZLBF5xu2x0pS+fXNag0j4qaI6ImInjFjxgxycwAaVFPOkq/AsMAYi4402Ntg3idplqRvl1/vbVqPhqlHH300GV+0aFHN65g8eXIyPmPGjGR8xAg+0QpN03U5m0u12wEedNBByfi6deuS8Wr5feONNybjqYkWO++8c7It2l5L8zU13tUz1kmMd0ir5SOT7pD0M0n/yvYa2+eqSIRjbK+QdEy5DGAYIGeB9kG+opsMeKQzIk6v8tIXm9wXAE1AzgLtg3xFN+F4NgAAALKj6AQAAEB2FJ0AAADIbrCz17vOQw89lIxHRM3rOOyww5LxUaNGDapPjUr1/YMPPki2rTZzcfny5cl4T09PMj5lypQaewe01sMPP5yMX3zxxcl4tVnqkyZNSsbnzZuXjJ955pk19A7IJzXe1TPWScNrvKvWd8a7oceRTgAAAGRH0QkAAIDsKDoBAACQHUUnAAAAsqPoBAAAQHbMXu9j8+bNyfgzzzyTjNuued3Tp08fTJdqVq3vL730UjL+4osv9oudffbZTenLrFmzkvEjjzwyGee+u2ilOXPm9IutX78+2fbdd9+ta93XX399Mj5t2rS61gM0Wz3jXT1jndSa8a6esU5qzXjX7WNdd+89AAAAhgRFJwAAALKj6AQAAEB2FJ0AAADIjqITAAAA2TF7vY+NGzcm4xs2bKhrPan7zjZrturixYuT8blz5ybjr776ajK+++6794vtt99+ybavvPJKbZ0r3XPPPcn4Nddck4yPHj26rvUDg7Fp06Zk/JFHHukXW716dbJttRm/t912WzI+derUGnsHDK1mjHfV7rHeivGunrFOas141+1jHUc6AQAAkB1FJwAAALKj6AQAAEB2FJ0AAADIbsCi0/Yttt+0vawiNt/2a7afKR9fzttNALUiZ4H2Qb6im9Qye32BpO9I+kGf+N9FxJVN71GLXXHFFcn4ypUr61rPa6+91i/2/vvvJ9uOGjUqGa82G/2qq65KxrfffvtkfM2aNcn4brvtVnPbcePGJePVnHHGGcl4t8/cGyIL1EU5m/Lee+8l49XuB/3CCy/UvO5qs9RnzpyZjNd7z2p0nQVqUb42Y7xLjXVSa8a7esa6bbVnvMtnwCOdEfGkpPVD0BcATUDOAu2DfEU3aeSaztm2nytPDezatB4ByIWcBdoH+YqOM9ii8wZJEyRNlrRWUvr4tyTb59leantpb2/vIDcHoEE15Sz5CgwLjLHoSIMqOiPijYj4TUR8JOn7kg7dRtubIqInInrGjBkz2H4CaECtOUu+Aq3HGItONaii0/bYisUTJS2r1hZA65GzQPsgX9GpBpy9bvsOSUdL2sP2GknflHS07cmSQtIqSefn6+LQGj9+fFPWk5oVd9ZZZyXbnnDCCcn4tddem4yff376233hhRcm49Vm7qVUm1lY7d6169atq3ndGBrdlrMpjz76aDK+aNGimtcxefLkZHzGjBnJ+IgRfOwx6tfKfG3GeFdtBngrxrt6xjqJ8a4VBiw6I+L0RPjmDH0B0ATkLNA+yFd0E/41BwAAQHYUnQAAAMiOohMAAADZUXQCAAAgu1ruvd5VTjvttGT8oosuanjdDz74YF3xavfFPffcc5PxXXbZJRnfsmVLMn7DDTf0i02dOjXZ9sADD0zGFy9enIxPnDgxGQeGwkMPPZSMR0TN6zjssMOS8WozXnNL9f2DDz5Itq02S3/58uXJeE9PTzI+ZcqUGnuHdtRp4109Y53EeNcKHOkEAABAdhSdAAAAyI6iEwAAANlRdAIAACA7JhL1MXr06GT81FNPTcbvuuuubH05/vjjk/FqE4Y+/PDDZPyoo45KxpcsWTKoflW65JJLkvHZs2c3vG5gIJs3b07Gn3nmmWTcds3rnj59+mC6VLNqfX/ppZeS8RdffLFf7Oyzz25KX2bNmpWMH3nkkck4t/zsDPWMdznHOqk5413OsU5ivGsG/nIAAAAgO4pOAAAAZEfRCQAAgOwoOgEAAJAdRScAAACyY/Z6H9ttl/6WzJ8/PxnPOaPviCOOSMb32muvZLzaLcBWrFhR8zbHjBmTjFeb3TpnzpxkfPvtt695m8Bgbdy4MRnfsGFDXetJ3fJy2rRpg+pTX9VunTd37txk/NVXX03Gd999936x/fbbL9n2lVdeqa1zpXvuuScZv+aaa5LxarOe0V7qGe9yz15vxnhXz1gnMd61Akc6AQAAkB1FJwAAALKj6AQAAEB2FJ0AAADIjqITAAAA2Q04e932vpJ+IGkvSR9JuikirrW9m6Q7JY2XtErSqRFR35TRNjJx4sRk/M4770zGU7PcVq9eXdc2q83ArRaPiGS82v2mL7jggn6xq666Ktl21KhRyTiGl27L1yuuuCIZX7lyZV3ree211/rF3n///WTbarlQbTZ6tZyqNuN1zZo1yfhuu+1Wc9tx48Yl49WcccYZyTiz1PMbjjmbGu/qGeuk1ox39Yx1EuNdK9RypHOLpK9HxCRJh0v6iu0DJM2V9HhETJT0eLkMoLXIV6C9kLPoGgMWnRGxNiKeLp9vlLRc0j6SpktaWDZbKGlGpj4CqBH5CrQXchbdpK5rOm2Pl3SwpJ9L+lRErJWKpJG0Z5X3nGd7qe2lvb29DXYXQK3IV6C9kLPodDUXnbZ3knS3pK9GxDu1vi8iboqInojoqfbp/wCai3wF2gs5i25QU9Fpe3sVyXBbRPyoDL9he2z5+lhJb+bpIoB6kK9AeyFn0S1qmb1uSTdLWh4RV1e8dJ+kWZK+XX69N0sPh4mRI0cm46ecckoyPmPGjH6xe+9Nf4vuv//+ZPzWW2+trXOlarNhly1bloxPmDChX6zafqI9dFu+jh8/vinrSc0CP+uss5JtTzjhhGT82muvTcbPP//8ZPzCCy9MxlOz1KupNss2dZ92SVq3bl3N68bQGI45mxoH6hnrpNaMd/WMdRLjXSsMWHRKOlLS2ZKet/1MGZunIhHusn2upFclpX8jAQwl8hVoL+QsusaARWdE/IOk9IdfSV9sbncANIJ8BdoLOYtuwh2JAAAAkB1FJwAAALKj6AQAAEB2tUwkwiCkZtadfPLJybbV4gsXLkzGARROO+20ZPyiiy5qeN0PPvhgXfFq94E/99xzk/FddtklGd+yZUsyfsMNN/SLTZ06Ndn2wAMPTMYXL16cjKfutQ3UotqnpjDeIYUjnQAAAMiOohMAAADZUXQCAAAgO4pOAAAAZEfRCQAAgOyYvQ6gbY0ePToZP/XUU5Pxu+66K1tfjj/++GS82iz1Dz/8MBk/6qijkvElS5YMql+VLrnkkmR89uzZDa8bAAbCkU4AAABkR9EJAACA7Cg6AQAAkB1FJwAAALKj6AQAAEB2zF4H0La22y79J2z+/PnJeM7Z60cccUQyvtdeeyXj1e6xvmLFipq3OWbMmGR81qxZyficOXOS8Wr3zwaAZuJIJwAAALKj6AQAAEB2FJ0AAADIjqITAAAA2Q04kcj2vpJ+IGkvSR9JuikirrU9X9J/lNRbNp0XEQ/m6iiAgZGvhYkTJybjd955ZzKemmCzevXqura5YcOGuuIRkYzbTsYvuOCCfrGrrroq2XbUqFHJOIYfchbdpJbZ61skfT0inrb9u5Kesv1Y+drfRcSV+boHoE7kK9BeyFl0jQGLzohYK2lt+Xyj7eWS9sndMQD1I1+B9kLOopvUdU2n7fGSDpb08zI02/Zztm+xvWuV95xne6ntpb29vakmADIgX4H2Qs6i09VcdNreSdLdkr4aEe9IukHSBEmTVfyXlry4KCJuioieiOip9kHGAJqLfAXaCzmLblBT0Wl7exXJcFtE/EiSIuKNiPhNRHwk6fuSDs3XTQC1Il+B9kLOolvUMnvdkm6WtDwirq6Ijy2vRZGkEyUty9NFALUiXwsjR45Mxk855ZRkfMaMGf1i9957b7Lt/fffn4zfeuuttXWuVO3Wk8uWpX80EyZM6Bertp9oH+Qsukkts9ePlHS2pOdtP1PG5kk63fZkSSFplaTzM/QPQH3IV6C9kLPoGrXMXv8HSakPjuPzwoBhhnwF2gs5i27CHYkAAACQHUUnAAAAsqPoBAAAQHa1TCQCgI6Wmkl+8sknJ9tWiy9cuLCpfQKATsORTgAAAGRH0QkAAIDsKDoBAACQHUUnAAAAsqPoBAAAQHaOiKHbmN0r6Vfl4h6S3hqyjbcO+zk8/V5EjGl1J4Yz8rXjtdO+kq81IGc7WrvtZzJnh7To/NiG7aUR0dOSjQ8h9hOdoFt+vt2yn1J37Ws36pafL/vZXji9DgAAgOwoOgEAAJBdK4vOm1q47aHEfqITdMvPt1v2U+qufe1G3fLzZT/bSMuu6QQAAED34PQ6AAAAshvyotP2sbZftr3S9tyh3n5Otm+x/abtZRWx3Ww/ZntF+XXXVvaxGWzva3uR7eW2X7D952W84/YVnZuz5Gvn7Ss6N1+l7sjZTs/XIS06bY+U9F1JX5J0gKTTbR8wlH3IbIGkY/vE5kp6PCImSnq8XG53WyR9PSImSTpc0lfKn2Mn7mtX6/CcXSDytdP2tat1eL5K3ZGzHZ2vQ32k81BJKyPilxHxgaQfSpo+xH3IJiKelLS+T3i6pIXl84WSZgxln3KIiLUR8XT5fKOk5ZL2UQfuKzo3Z8nXzttXdG6+St2Rs52er0NddO4jaXXF8poy1sk+FRFrpeKXSdKeLe5PU9keL+lgST9Xh+9rl+q2nO3o32HyteN1W75KHfx73In5OtRFpxMxps+3Kds7Sbpb0lcj4p1W9wdZkLMdgnztCuRrh+jUfB3qonONpH0rlj8t6fUh7sNQe8P2WEkqv77Z4v40he3tVSTEbRHxozLckfva5botZzvyd5h87Rrdlq9SB/4ed3K+DnXRuUTSRNv72f6EpNMk3TfEfRhq90maVT6fJeneFvalKWxb0s2SlkfE1RUvddy+outytuN+h8nXrtJt+Sp12O9xp+frkH84vO0vS7pG0khJt0TEt4a0AxnZvkPS0ZL2kPSGpG9K+ntJd0kaJ+lVSadERN8LoduK7aMk/S9Jz0v6qAzPU3HdSUftKzo3Z8lX8rUTdWq+St2Rs52er9yRCAAAANlxRyIAAABkR9EJAACA7Cg6AQAAkB1FJwAAALKj6AQAAEB2FJ0AAADIjqITAAAA2VF0AgAAILv/B+EnbEwamKlKAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 864x216 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "image = X_train[90]\n",
    "shifted_image_down = shift_image(image, 0, 5)\n",
    "shifted_image_left = shift_image(image, -5, 0)\n",
    "\n",
    "plt.figure(figsize=(12,3))\n",
    "plt.subplot(131)\n",
    "plt.title(\"Original\", fontsize=14)\n",
    "plt.imshow(image.reshape(28, 28), interpolation=\"nearest\", cmap=\"Greys\")\n",
    "plt.subplot(132)\n",
    "plt.title(\"Shifted down\", fontsize=14)\n",
    "plt.imshow(shifted_image_down.reshape(28, 28), interpolation=\"nearest\", cmap=\"Greys\")\n",
    "plt.subplot(133)\n",
    "plt.title(\"Shifted left\", fontsize=14)\n",
    "plt.imshow(shifted_image_left.reshape(28, 28), interpolation=\"nearest\", cmap=\"Greys\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7fd23723",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:52:57.410950Z",
     "start_time": "2021-10-08T00:52:31.247725Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "X_train_augmented = [image for image in X_train]\n",
    "y_train_augmented = [label for label in y_train]\n",
    "\n",
    "for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1)):\n",
    "    for image, label in zip(X_train, y_train):\n",
    "        X_train_augmented.append(shift_image(image, dx, dy))\n",
    "        y_train_augmented.append(label)\n",
    "\n",
    "X_train_augmented = np.array(X_train_augmented)\n",
    "y_train_augmented = np.array(y_train_augmented)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f0b9af97",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:52:58.970229Z",
     "start_time": "2021-10-08T00:52:57.412154Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "shuffle_idx = np.random.permutation(len(X_train_augmented))\n",
    "X_train_augmented = X_train_augmented[shuffle_idx]\n",
    "y_train_augmented = y_train_augmented[shuffle_idx]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "56492c50",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:52:58.973164Z",
     "start_time": "2021-10-08T00:52:58.971294Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "knn_clf = KNeighborsClassifier(**grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "91b7f671",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:52:59.414359Z",
     "start_time": "2021-10-08T00:52:58.974182Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=4, weights='distance')"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn_clf.fit(X_train_augmented, y_train_augmented)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "98dd96b3",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:54:46.201483Z",
     "start_time": "2021-10-08T00:52:59.415458Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9763"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred = knn_clf.predict(X_test)\n",
    "accuracy_score(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70e66890",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 处理泰坦尼克号数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1f9b5ac9",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:54:46.462191Z",
     "start_time": "2021-10-08T00:54:46.202599Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "train_data=pd.read_csv('datasets/titanic/train.csv')\n",
    "test_data=pd.read_csv('datasets/titanic/test.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "97db8eed",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:54:46.473180Z",
     "start_time": "2021-10-08T00:54:46.463278Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Name</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Ticket</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Cabin</th>\n",
       "      <th>Embarked</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Braund, Mr. Owen Harris</td>\n",
       "      <td>male</td>\n",
       "      <td>22.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>A/5 21171</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n",
       "      <td>female</td>\n",
       "      <td>38.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>PC 17599</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C85</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>Heikkinen, Miss. Laina</td>\n",
       "      <td>female</td>\n",
       "      <td>26.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>STON/O2. 3101282</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n",
       "      <td>female</td>\n",
       "      <td>35.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>113803</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>C123</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Allen, Mr. William Henry</td>\n",
       "      <td>male</td>\n",
       "      <td>35.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>373450</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Survived  Pclass  \\\n",
       "0            1         0       3   \n",
       "1            2         1       1   \n",
       "2            3         1       3   \n",
       "3            4         1       1   \n",
       "4            5         0       3   \n",
       "\n",
       "                                                Name     Sex   Age  SibSp  \\\n",
       "0                            Braund, Mr. Owen Harris    male  22.0      1   \n",
       "1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1   \n",
       "2                             Heikkinen, Miss. Laina  female  26.0      0   \n",
       "3       Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0      1   \n",
       "4                           Allen, Mr. William Henry    male  35.0      0   \n",
       "\n",
       "   Parch            Ticket     Fare Cabin Embarked  \n",
       "0      0         A/5 21171   7.2500   NaN        S  \n",
       "1      0          PC 17599  71.2833   C85        C  \n",
       "2      0  STON/O2. 3101282   7.9250   NaN        S  \n",
       "3      0            113803  53.1000  C123        S  \n",
       "4      0            373450   8.0500   NaN        S  "
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "67bbfba1",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-10-08T00:54:46.481473Z",
     "start_time": "2021-10-08T00:54:46.474274Z"
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Name</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Ticket</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Cabin</th>\n",
       "      <th>Embarked</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>892</td>\n",
       "      <td>3</td>\n",
       "      <td>Kelly, Mr. James</td>\n",
       "      <td>male</td>\n",
       "      <td>34.5</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>330911</td>\n",
       "      <td>7.8292</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Q</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>893</td>\n",
       "      <td>3</td>\n",
       "      <td>Wilkes, Mrs. James (Ellen Needs)</td>\n",
       "      <td>female</td>\n",
       "      <td>47.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>363272</td>\n",
       "      <td>7.0000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>894</td>\n",
       "      <td>2</td>\n",
       "      <td>Myles, Mr. Thomas Francis</td>\n",
       "      <td>male</td>\n",
       "      <td>62.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>240276</td>\n",
       "      <td>9.6875</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Q</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>895</td>\n",
       "      <td>3</td>\n",
       "      <td>Wirz, Mr. Albert</td>\n",
       "      <td>male</td>\n",
       "      <td>27.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>315154</td>\n",
       "      <td>8.6625</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>896</td>\n",
       "      <td>3</td>\n",
       "      <td>Hirvonen, Mrs. Alexander (Helga E Lindqvist)</td>\n",
       "      <td>female</td>\n",
       "      <td>22.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3101298</td>\n",
       "      <td>12.2875</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Pclass                                          Name     Sex  \\\n",
       "0          892       3                              Kelly, Mr. James    male   \n",
       "1          893       3              Wilkes, Mrs. James (Ellen Needs)  female   \n",
       "2          894       2                     Myles, Mr. Thomas Francis    male   \n",
       "3          895       3                              Wirz, Mr. Albert    male   \n",
       "4          896       3  Hirvonen, Mrs. Alexander (Helga E Lindqvist)  female   \n",
       "\n",
       "    Age  SibSp  Parch   Ticket     Fare Cabin Embarked  \n",
       "0  34.5      0      0   330911   7.8292   NaN        Q  \n",
       "1  47.0      1      0   363272   7.0000   NaN        S  \n",
       "2  62.0      0      0   240276   9.6875   NaN        Q  \n",
       "3  27.0      0      0   315154   8.6625   NaN        S  \n",
       "4  22.0      1      1  3101298  12.2875   NaN        S  "
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_data.head()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "tf",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.18"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": false,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "609px",
    "left": "35px",
    "top": "52px",
    "width": "288px"
   },
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
